Laravel分块技术并未减少PHP内存使用量

9

我一直在尝试使用 Laravel 的 Eloquent 分块技术,但是遇到了问题。考虑以下代码(这是我的问题的更简化版本):

$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 或者我是否误解了它的作用?


4
在做一些调查后,在我们的查询之前加上DB::disableQueryLog()将解决我们的问题。 - tiffanyhwang
1
正如你自己发现的那样,查询日志正在消耗内存。话虽如此,你也可以在构造函数中为单个类调整内存限制,方法如下:ini_set('memory_limit', $this->memorylimit); - nielsstampe
1
使用Laravel Debugbar以获得更好的洞察。 - user4898812
2个回答

1
分块数据并不能减少内存使用量,您需要像直接使用数据库分页一样进行操作。例如,首先按id或其他方式获取前200个结果,处理完后再次执行带有where子句的查询以获取接下来的200个结果。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接