查看代码以防止允许的内存限制问题
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();
);
【讨论】:
谢谢。我会试试这个并告诉你。以上是关于查看代码以防止允许的内存限制问题的主要内容,如果未能解决你的问题,请参考以下文章