我正在从一个数据库迁移到另一个数据库,项目正在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条记录后显示错误。
答案 0 :(得分:1)
这里有一种“内存泄漏”。你需要找出哪些变量占用了所有这些内存。尝试使用此函数进行调试,看看哪个变量不断增长
function sizeofvar($var) {
$start_memory = memory_get_usage();
$tmp = unserialize(serialize($var));
return memory_get_usage() - $start_memory;
}
一旦你知道变量占用了所有内存,你就可以开始实施适当的措施了。
答案 1 :(得分:1)
找到答案,laravel缓存所有查询,只需:StackPanel