Laravel分块不会减少PHP内存使用量

时间:2014-01-14 11:12:22

标签: php memory-management laravel chunking

所以我一直在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或者我误解了它的作用的任何线索?

2 个答案:

答案 0 :(得分:0)

分块数据不会减少内存使用量,您需要直接使用数据库进行分页。

首先按ID或其他东西首先获取200个订单,然后在处理第一个200之后,再次使用where子句触发该查询,询问接下来的200个结果。

答案 1 :(得分:0)

您可以使用惰性收集来改善大数据收集的内存使用。它在后台使用PHP生成器。在https://laravel.com/docs/5.4/eloquent#chunking-results

处查看光标示例