【问题标题】:Laravel Eloquent cursor() out of memoryLaravel Eloquent cursor() 内存不足
【发布时间】:2021-09-25 04:21:43
【问题描述】:

我对 Laravel 的 ORM Eloquent cursor() 方法有疑问。我正在尝试为我的电子商务创建一些分析功能来获取订单/收入的数量和类似的东西,你可以在下面查看我的代码:

$fromDate = Carbon::now()->startOfYear()->toDateString();
$tillDate = Carbon::now()->endOfYear()->toDateString();

$orders = Order::cursor()->whereBetween('created_at', [$fromDate, $tillDate])->whereIn('status', array(1, 2, 3))->filter(function ($order) { 
  return $order; 
});
$countO = $orders->count();
$sumO = $orders->sum('total');

$orders = VoucherOrder::cursor()->whereBetween('created_at', [$fromDate, $tillDate])->where('status', 1)->filter(function ($order) {
  return $order;
});
$countV = $orders->count();
$sumV = $orders->sum('total');

$orders = $countO + $countV;
$income = $sumO + $sumV;

if($orders != 0) {
  $avgOrder = $income / $orders;
}
else {
  $avgOrder = 0;
}

return view('admin.income', compact('orders', 'income', 'avgOrder'));

我使用 cursor() 来减少内存使用量,因为我正在处理大量数据,但我仍然收到此错误:

允许的内存大小为 536870912 字节已用尽(试图分配 2338688 字节)

我做错了什么?我该如何解决?

【问题讨论】:

标签: php laravel eloquent laravel-7


【解决方案1】:

如果你想在不编辑php.ini文件的情况下减少内存使用,我建议使用chunk而不是cursor()

Model::chunk(250, function ($data) {
    foreach ($d as $data) {
        // your code
    }
});

这将占用更少的内存,但请记住,与 cursor() 相比,这可能会花费几秒钟的时间来执行。

【讨论】:

    【解决方案2】:

    尝试编辑 /etc/php5/fpm/php.ini:

    memory_limit = 2048M 重启nginx:

    sudo systemctl restart nginx
    

    【讨论】:

    • 关于如何在不增加 memory_limit 的情况下解决的任何想法?
    • 如果您不能一次加载所有缓存,您也可以分块缓存。您是否需要同时提供所有数据?这是一次加载到内存中的大量记录。也许您可以设法解决问题,这样您就可以一次对这些记录执行所需的操作,并在完成后将它们从内存中删除。
    • 页面会根据日期范围显示收入和订单数量,所以如果我选择全年,则需要处理大量数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2021-02-15
    • 2018-04-07
    • 2020-01-08
    • 2015-08-15
    • 2020-10-17
    相关资源
    最近更新 更多