Выбор ответа Junior Производительность: OPcache и FPM спрашивают часто обновлено

Экономия памяти при выгрузке

Вопрос

Экспорт 500 000 строк из базы в CSV падает с Allowed memory size exhausted. Что исправит проблему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Читать порциями и писать построчно в поток через fputcsv. Загрузка всех строк в массив (и тем более в модели ORM) держит в памяти весь результат.

Варианты ответа

  1. Поднять memory_limit до 10 ГБ для этого скрипта
  2. Вызвать gc_collect_cycles() после загрузки строк
  3. Читать порциями и писать построчно в поток через fputcsvправильный ответ
  4. Включить OPcache, чтобы данные хранились в нём

Разбор

Загрузка всех строк в массив (и тем более в модели ORM) держит в памяти весь результат. Потоковая обработка ограничивает память размером одной пачки. Увеличение лимита лишь откладывает проблему и мешает другим воркерам. Сборщик циклов не освободит данные, на которые есть ссылки. OPcache кеширует код, а не данные.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.