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
Ответить

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

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

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

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

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