2016-08-02 4 views
0

Я использую цикл while, чтобы извлекать записи из mysql. это для сброса журнала, который был взломан при аварии, поэтому я исправляю предыдущие записи, вытаскивая идентификатор и метку времени из резервной копии БД и обновляя производственную таблицу этими значениями.Использование памяти php во время цикла

Я надеялся ограничить использование памяти и думал, что это решение будет использовать намного меньше, так как в этой таблице журналов есть 12 545 628 записей. Потяните только поля идентификатора и отметки времени, которые он обрывает через 1 ГБ памяти довольно быстро.

Является ли это ограничение использования памяти одной записью за раз, или она использует то же самое, что и прямое вытягивание всех идентификаторов и штампов времени и отслеживание их?

(я имею установки класса базы данных, так что PDO может выглядеть странно)

$sql = 'SELECT id, timestamp FROM log_people WHERE 1'; 
$Test->sqlQuery($sql); 

while ($testdb = $Test->sth->fetch(PDO::FETCH_ASSOC)) { 
    $Prod->beginTransaction(); 

    try { 
     $sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id']; 
     $Prod->sqlQuery($sql2); 


    } catch (exception $err) { 
     $Prod->rollback(); 
     echo $err->getMessage(); 
    } 
} 

Должен ли я делать ниже код, чтобы просто тянуть и изменить одну запись за один раз?

while ($count < 12545628){ 
    $sql = 'SELECT id, timestamp FROM log_people WHERE id ='.$count; 
    $Test->sqlQuery($sql); 
    $testdb = $Test->sth->fetch(PDO::FETCH_ASSOC) 

$Prod->beginTransaction(); 

try { 
    $sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id']; 
    $Prod->sqlQuery($sql2); 
    $count++; 


} catch (exception $err) { 
     $Prod->rollback(); 
     //return $err->getMessage(); 
     echo $err->getMessage(); 
    } 

}

+1

Так скажите нам - зачем вам «выбирать» все записи? Если все записи должны быть обновлены - зачем их выбирать? –

+1

Не могли бы вы сделать это намного быстрее и быстрее, поставив копию таблицы резервного копирования в том же БД и используя SQL для обновления производственной таблицы? Зачем это делать в PHP? –

ответ

0

В ваших проблемах, вы обновляете таблицу с аналогичными предыдущими значениями. С точки зрения памяти ограничение памяти php может быть определено в php.ini или php-коде. И ваш второй код эффективен по сравнению с первым, но требует много времени из-за раздельных запросов для каждого идентификатора.

0

Я также не понимаю, почему вам нужно выбирать все записи при обновлении этих записей. В любом случае есть несколько советов, которые помогут вам позаботиться об использовании памяти.
Первый пункт Есть функции, которые расскажут вам, где заканчивается ваш скрипт, и вы можете проверить его, используя эту функцию memory_get_peak_usage();.
Второй пункт Вы также можете переназначить нуль в vars вместе с их установкой. Функция unset(); полезна, когда сборщик мусора делает свои раунды, но до тех пор, пока не будет отменено(); функция просто уничтожает ссылку на переменные, данные все еще существуют в памяти, и PHP видит, что память используется, несмотря на то, что у нее больше нет указателя на нее. Решение. Назначьте null своим переменным, чтобы очистить данные, по крайней мере до тех пор, пока сборщик мусора не схватит его. $ var = null; Вы также можете использовать unset(); чтобы сбросить переменную указатель, однако есть небольшая разница в использовании памяти, насколько я могу судить:

unset($var); 


Третья точка Другим способом вы можете сделать это уничтожить ваши ссылки на объекты по утилизации объекта ,

protected function __distruct() 
{ 
    $this-&gt;childObject = null; 
} 
Смежные вопросы