Выбор ответа Junior Производительность: OPcache и FPM спрашивают часто обновлено
Экономия памяти при выгрузке
Вопрос
Экспорт 500 000 строк из базы в CSV падает с Allowed memory size exhausted. Что исправит проблему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Читать порциями и писать построчно в поток через fputcsv. Загрузка всех строк в массив (и тем более в модели ORM) держит в памяти весь результат.
Варианты ответа
- Поднять
memory_limitдо 10 ГБ для этого скрипта - Вызвать
gc_collect_cycles()после загрузки строк - Читать порциями и писать построчно в поток через
fputcsvправильный ответ - Включить OPcache, чтобы данные хранились в нём
Разбор
Загрузка всех строк в массив (и тем более в модели ORM) держит в памяти весь результат. Потоковая обработка ограничивает память размером одной пачки. Увеличение лимита лишь откладывает проблему и мешает другим воркерам. Сборщик циклов не освободит данные, на которые есть ссылки. OPcache кеширует код, а не данные.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.