PHP не хватает памяти, несмотря на ограничение и компенсацию запроса ⇐ Php

Кемеровские программисты php общаются здесь
Anonymous
PHP не хватает памяти, несмотря на ограничение и компенсацию запроса

Сообщение Anonymous »

Справочная информация
Необработанный SQL-запрос со множеством объединений, выборок и прочего при загрузке

Код: Выделить всё

$results = DB::SELECT($query)
создает коллекцию $results объемом около 500 МБ и 450 000 элементов, что не очень хорошо.
Решение
Поэтому вместо этого $query теперь создает временную таблицу, которая считывается следующим образом:

Код: Выделить всё

$new_rows = true;
$chunk = 25000;
$offset = 0;

while ($new_rows) {
$chunked_results = DB::SELECT('SELECT * FROM tmp_table ORDER BY id DESC LIMIT ' . $chunk . ' OFFSET ' . $offset );

if (count($chunked_results) === 0) {
$new_rows = false;
}

foreach ($chunked_results as $row) {
//Do stuff with $row
}

$offset+= $chunk;
unset($chunked_results);
}
Проблема
Несмотря на снятие настроек $chunked_results после каждого запроса, моему скрипту по-прежнему не хватает памяти в районе 75-тысячного ряда - почти тоже самое нет. строк, которые были загружены без фрагментации/tmp_table.
Это заставляет меня поверить, что каким-то образом содержимое предыдущих $chunked_results сохраняется в памяти и на самом деле не сбрасывается, или DB::class запоминает данные в фоновом режиме.
Выполнение DB::RECONNECT('mysql') уничтожает временную таблицу :(

Подробнее здесь: https://stackoverflow.com/questions/791 ... ting-query

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