【问题标题】:Laravel chunking not reducing PHP memory usageLaravel 分块不会减少 PHP 内存使用量
【发布时间】:2014-02-02 10:15:59
【问题描述】:

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

【问题讨论】:

  • 好的,在我们的查询将解决我们的问题之前,先添加DB::disableQueryLog()
  • 正如您自己发现的那样,查询日志正在消耗内存。话虽如此,您还可以在构造函数中调整单个类的内存限制,如下所示:ini_set('memory_limit', $this->memorylimit);
  • 使用 Laravel 调试栏获得更好的洞察力

标签: php memory-management laravel chunking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2021-07-18
      • 1970-01-01
      • 2020-01-01
      相关资源
      最近更新 更多