Есть ли в базе данных chunk() утечка памяти?MySql

Форум по Mysql
Ответить
Anonymous
 Есть ли в базе данных chunk() утечка памяти?

Сообщение 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)

Что я пробовал
Я попробовал поместить следующее внутрь цикла фрагментов, надеясь, что это освободит память. На потребление памяти это не повлияло.
unset($rows);
flush();
gc_collect_cycles();


Подробнее здесь: https://stackoverflow.com/questions/798 ... emory-leak
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»