Как обработать 250 000 строк таблицы в Laravel?

Добрый день. Для подсчёта статистики мне нужно обработать 250 000 записей из таблицы.

Делаю так:
DB::connection()->disableQueryLog();
foreach (DB::table('table_name')->get() as $row)
{
	//
}


Получаю Allowed memory size of 536870912 bytes exhausted
Пробовал так:

DB::table('table_name')->chunk(100, function($rows)
{
	foreach($rows as $row)
	{
		//
	}
});


Процесс mysqld нагружается до 70% и так висит, результата нет. Даже если сделать так:

DB::table('table_name')->limit(10)->chunk(10, function($rows)
{
	foreach($rows as $row)
	{
		//
	}
});


Процесс виснет. Подскажите, как правильно задачу выполнить? Спасибо.
  • Вопрос задан
  • 1009 просмотров
Пригласить эксперта
Ответы на вопрос 3
AmdY
@AmdY
PHP и прочие вебштучки
Вариант с chunk работает даже на 1M записей, возможно у вас проблема внутри замыкания или настройках mysql, тем более что память не течёт как и положено для chunk.
Ответ написан
Комментировать
Делайте запасами sql. Если логика сложная и не реализуема на sql, воспользуйтесь командами (jobs) и очередями (queues). Ну и если нет возможности для cli увеличить лимиты памяти, разбивайте на блоки весь объём и исполняйте параллельно или последовательно.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Вам обязательно для этого использовать php? Частичную (или полную обработку) по идее можно самим мускулом, результаты - во временную таблицу. На поля с поиском (не полнотекстовым) имеет смысл поставить индексы.

DB::table('table_name')->limit(10)->chunk(10, function($rows)


Я не силен в Laravel, но судя по доке limit не нужен + чанкуйте по больше записей, например 500
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы