В laravel у меня есть запрос, который ищет тысячи строк в базе данных, и я пытаюсь скомпилировать его в файл CSV. Пытаясь сократить использование памяти, я получаю 500 строк за раз и выдаю CSV.
$callback = function () use ($query) {
$file = fopen('php://output', 'w');
$query->chunk(500, function ($rows) use ($file) {
foreach ($rows as $key => $row) {
fputcsv($file, array_map(...$rows...));
}
log_info("Memory used " . memory_get_usage());
});
fclose($file);
};
$headers = [ ... ];
return response()->stream($callback, 200, $headers);
Реальный запрос немного сложнее и включает в себя получение связанных моделей, которые также необходимо обновить. Когда я запускаю это, он начинает генерировать файл CSV, и через некоторое время ему не хватает памяти. Это в моем журнале
(59): Memory used 17208328;
(59): Memory used 25105328;
(59): Memory used 30601328;
...
(59): Memory used 127380496;
(59): Memory used 129352584;
(59): Memory used 131207672;
[2025-11-23 23:50:15] qa.ERROR: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16384 bytes)
Что я пробовал
Я попробовал поместить следующее внутрь цикла фрагментов, надеясь, что это освободит память. На потребление памяти это не повлияло.
unset($rows);
flush();
gc_collect_cycles();
Подробнее здесь: https://stackoverflow.com/questions/798 ... emory-leak
Есть ли в базе данных chunk() утечка памяти? ⇐ MySql
Форум по Mysql
-
Anonymous
1763970903
Anonymous
В laravel у меня есть запрос, который ищет тысячи строк в базе данных, и я пытаюсь скомпилировать его в файл CSV. Пытаясь сократить использование памяти, я получаю 500 строк за раз и выдаю CSV.
$callback = function () use ($query) {
$file = fopen('php://output', 'w');
$query->chunk(500, function ($rows) use ($file) {
foreach ($rows as $key => $row) {
fputcsv($file, array_map(...$rows...));
}
log_info("Memory used " . memory_get_usage());
});
fclose($file);
};
$headers = [ ... ];
return response()->stream($callback, 200, $headers);
Реальный запрос немного сложнее и включает в себя получение связанных моделей, которые также необходимо обновить. Когда я запускаю это, он начинает генерировать файл CSV, и через некоторое время ему не хватает памяти. Это в моем журнале
(59): Memory used 17208328;
(59): Memory used 25105328;
(59): Memory used 30601328;
...
(59): Memory used 127380496;
(59): Memory used 129352584;
(59): Memory used 131207672;
[2025-11-23 23:50:15] qa.ERROR: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16384 bytes)
[b]Что я пробовал[/b]
Я попробовал поместить следующее внутрь цикла фрагментов, надеясь, что это освободит память. На потребление памяти это не повлияло.
unset($rows);
flush();
gc_collect_cycles();
Подробнее здесь: [url]https://stackoverflow.com/questions/79828385/does-database-chunk-have-a-memory-leak[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия