查看代码以防止允许的内存限制问题

Posted

技术标签:

【中文标题】查看代码以防止允许的内存限制问题【英文标题】:Review code to prevent allowed memory limit issue 【发布时间】:2020-07-17 07:57:24 【问题描述】:

虽然this may seem to be the right thing做,我感觉我的代码很糟糕。

我在 Docker 容器中运行我的 Laravel 6.x 应用程序。运行下面的代码时,我得到了

已用完**字节的允许内存大小(尝试分配8192字节)

无论我将memory_limit 设置多高,都会出现相同的错误(使用新限制)。所以我想查看我的代码:

// I'm running a seeder.
$arr = [1,2,3,4,5,.....];

// Get all users and update a column:
$users = Users:all();

// Loop and update (we have thousands ????)
foreach ($users as $user) 
  $index = array_rand($arr);
  $user->someColumn = $arr[$index];
  $user->save();

// Another loop for another model with same as above.....

这会导致“允许的内存”问题。有没有更好的方法来实现这一点?

【问题讨论】:

你可以在数据库层做这个吗?当然,如果你迭代每个用户,你会耗尽你的内存 您设置的memory_limit 是什么?你的系统有足够的内存吗? 嗨。你什么意思?原始 SQL?如果是这样,我将如何包含数组中的随机项? @Sylar 你真的需要 php 层的种子吗?如果都可以在 db 层做就更好了。 @Kevin 你能告诉我一个如何包含数组的例子,从数组中选择一个随机项,我应该在原始 sql 中做吗? linktoahref 的方法似乎进展顺利。 SQL方式似乎更先进。 【参考方案1】:

不是一次获取所有用户,而是获取chunk 个用户

\App\User::chunk(10, function ($users) use ($arr) 
    foreach ($users as $user) 
        $index = array_rand($arr);
        $user->someColumn = $arr[$index];
        $user->save();
    
);

【讨论】:

谢谢。我会试试这个并告诉你。

以上是关于查看代码以防止允许的内存限制问题的主要内容,如果未能解决你的问题,请参考以下文章

导出大量数据

Linux 如何限制内存的使用

Node内存限制与解决方案

如何修改PHP的memory_limit限制

docker内存及cpu限制(不断总结中)

linux进程数限制导致无法连接服务