В настоящее время я делаю миграцию из одной базы данных в другую, проект находится на laravel, поэтому я создаю команду laravel для этого. У меня есть одна таблица с 700000 записей. Я создал функцию с LIMIT и транзакциями для оптимизации запроса, но все еще вылезал из памяти ошибка из PHP.
Вот мой код:
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);
}
Ошибка заключается в следующем:
user@lenovo /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 записей.
Здесь есть своего рода «утечка памяти». Вам необходимо выяснить, какая из переменных занимает всю эту память. Попробуйте эту функцию для отладки и посмотрите, какая переменная постоянно растет
function sizeofvar($var) {
$start_memory = memory_get_usage();
$tmp = unserialize(serialize($var));
return memory_get_usage() - $start_memory;
}
Как только вы узнаете, какая переменная занимает всю память, вы можете приступить к осуществлению соответствующих мер.
Нашел ответ, Laravel кеширует все запросы, так что просто: DB::connection()->disableQueryLog();