2015-04-26 3 views
1

Я делаю переход от одной базы данных к другой, проект находится на laravel, поэтому я создаю команду laravel для этого. У меня есть одна таблица с около 700000 записей. Я создал функцию с LIMIT и транзакциями для оптимизации запроса, но все еще получаю ошибку памяти из PHP. Вот мой код:Ошибка ограничения памяти php laravel

ini_set('memory_limit', '750M'); // at beginning of file 

$circuit_c = DB::connection('legacy')->select('SELECT COUNT(*) FROM tbl_info'); 
$count = (array) $circuit_c[0]; 
$counc = $count['COUNT(*)']; 
$max = 1000; 
$pages = ceil($counc/$max); 

    for ($i = 1; $i < ($pages + 1); $i++) { 
     $offset = (($i - 1) * $max); 
     $start = ($offset == 0 ? 0 : ($offset + 1)); 
     $infos = DB::connection('legacy')->select('SELECT * from tbl_info LIMIT ' . $offset . ', ' . $max); 
     DB::connection('mysql')->transaction(function() use ($infos) { 
      foreach ($infos as $info) { 
       $validator = Validator::make($data = (array) $info, Info::$rules); 
       if ($validator->passes()) { 
        if ($info->record_type == 'C') { 
         $b_user_new = Info::create($data); 
         unset($b_user_new); 

        } 
       } 
       unset($info); 
       unset($validator); 
      } 
     }); 
     unset($infos); 
    } 

Ошибка заключается в следующем:

[email protected] /var/www/info $ php artisan migratedata 
PHP Fatal error: Allowed memory size of 786432000 bytes exhausted (tried to allocate 32 bytes) in /var/www/info/vendor/laravel/framework/src/Illuminate/Database/Grammar.php on line 75 

Ошибка шоу после импорта около 50000 записей.

+0

Затем увеличьте [сколько памяти PHP разрешено использовать] (https://www.google.dk/search?q=php+increase + память) ... Если у вас закончилась нехватка памяти, вы просто закончили работу; купить больше памяти или найти более эффективный способ переноса данных. –

+0

Мне нужен оптимизационный ответ, потому что я уже оптимизировал свои функции с использованием LIMIT и OFFSET, возможно, существует и другой эффективный способ. – Serghei

+0

Можете ли вы попробовать сделать это в кусках 100 вместо 1000 за транзакцию? –

ответ

1

Здесь есть «утечка памяти». Вам нужно выяснить, какая из переменных забивает всю эту память. Попробуйте эту функцию для отладки и увидеть, какие переменные продолжают постоянно расти

function sizeofvar($var) { 
    $start_memory = memory_get_usage(); 
    $tmp = unserialize(serialize($var)); 
    return memory_get_usage() - $start_memory; 
} 

После того, как вы знаете, что переменная принимает всю память, то вы можете приступить к осуществлению соответствующих мер.

+0

Я пробовал, но не могу найти утечки памяти, переменные все время одинакового размера 'I c: 96 Count c: 128 Circuit c: 840 Количество: 464 Страниц: 96 Макс: 96 Начало: 96 Смещение: 96 Информация: 7120136 Инфо: 7488 Инфо данные: 7392 Новая информация: 28312 PHP Неустранимая ошибка: Допустимая размер памяти 786432000 байт исчерпан (пытался выделить 5 байтов) var/www/info/app/commands/MigrateDataCommand.php в строке 358' – Serghei

+0

Что относительно sizeofvar (DB :: connection ('legacy'))? –

+0

Ошибка: [PDOException] Вы не можете сериализовать или нестиализовать экземпляры PDO – Serghei

1

Найдено ответ, Laravel кэширует все запросы, так просто: DB::connection()->disableQueryLog();