gpt4 book ai didi

php - 分派(dispatch)的作业保留在内存中,导致内存使用率较高

转载 作者:行者123 更新时间:2023-12-03 01:03:38 28 4
gpt4 key购买 nike

我正在努力在 Laravel 6.x 中使用 cursor() 方法获取 3M+ 记录时降低内存。

我有一个 artisan 命令运行以下代码:

Product::cursor()->each(function ($product) {
calculateStats::dispatch($product);
});

根据文档,它应该会导致内存使用率较低,但内存会不断爬升,直到达到我的 2G 限制。

我读到这可能是因为 PDO 连接使用缓冲查询,所以我尝试在运行查询之前添加此内容:

\DB::connection()->getPdo()->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

从这里:https://github.com/laravel/framework/issues/14919

这导致启动内存使用量较低,但结果仍然相同。我还尝试将其添加到 database.php 配置文件中,但结果相同。

我正在使用 MySQL 8,如果这有什么区别的话。

我使用 dispatch() 方法将其分发给工作人员,因为一次处理它们需要很长时间。

关于如何解决内存问题有什么好的建议吗?

编辑

经过一些额外的调试后,我觉得是作业调度占用了内存。由于作业已经发送到 Redis 队列,如何从内存中释放它?

FIY:设置使用 Redis 和 Horizo​​n。

最佳答案

就我而言,Laravel 的 Telescope 插件保留了对分派(dispatch)作业的引用,在运行 10,000 多个作业时导致非常明显的内存泄漏。

关于php - 分派(dispatch)的作业保留在内存中,导致内存使用率较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897350/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com