所以我一直在Eloquent尝试laravel的分块,但我遇到了一个问题。请考虑以下代码(我的问题的更简化版本):
$data = DB::connection('mydb')->table('bigdata')
->chunk(200, function($data) {
echo memory_get_usage();
foreach($data as $d) {
Model::create(
array(
'foo' => $d->bar,
...
//etc
));
}
}
因此,当我运行以下代码时,我的内存输出如下所示:
19039816
21490096
23898816
26267640
28670432
31038840
所以没有跳进php.ini
并更改memory_limit
值,为什么它不起作用?根据文档:“如果你需要处理很多(数千)Eloquent记录,使用chunk命令将允许你不用吃掉你所有的RAM”。
我在foreach函数之后尝试unset($data)
但它没有帮助。关于我如何利用chunk
或者我误解了它的作用的任何线索?
答案 0 :(得分:0)
分块数据不会减少内存使用量,您需要直接使用数据库进行分页。
首先按ID或其他东西首先获取200个订单,然后在处理第一个200之后,再次使用where子句触发该查询,询问接下来的200个结果。
答案 1 :(得分:0)
您可以使用惰性收集来改善大数据收集的内存使用。它在后台使用PHP生成器。在https://laravel.com/docs/5.4/eloquent#chunking-results
处查看光标示例