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

2 回答 2

1

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

就像首先通过 id 或其他东西获取开始 200 个订单,并在处理前 200 个之后,使用 where 子句询问下一个 200 个结果再次触发该查询。

于 2016-07-28T10:35:52.313 回答
1

您可以使用惰性集合来改进大量数据集合的内存使用。它在后台使用 PHP 生成器。看看这里的光标示例https://laravel.com/docs/5.4/eloquent#chunking-results

于 2020-11-20T17:44:05.210 回答