python - 为运行多处理队列的 python 脚本激活内存不足 killer ?

标签 python queue out-of-memory multiprocessing kill-process

我写了一个 python 程序,需要一次运行多天,因为要不断收集数据。以前我一次运行这个程序几个月都没有问题。我最近对该程序进行了一些更新,现在大约 12 小时后我遇到了可怕的内存不足 killer 。 'dmesg' 输出如下:

[9084334.914808] Out of memory: Kill process 2276 (python2.7) score 698 or sacrifice child
[9084334.914811] Killed process 2276 (python2.7) total-vm:13279000kB, anon-rss:4838164kB, file-rss:8kB

除了一般的 python 编码之外,对程序所做的主要更改是添加了一个多处理队列。这是我第一次使用这个功能,所以我不确定这是否是问题的原因。我程序中队列的目的是能够在并行过程中进行动态更改。队列在主程序中启动,并在并行进程中不断受到监视。下面是我在并行过程中如何执行此操作的简化版本(“q”是队列):

while(1):

    if q.empty():
        None

    else:
        fr = q.get()
        # Additional code

    time.sleep(1)

'q' 的动态变化并不经常发生,所以大部分时间 q.empty() 为真,但是一旦发生变化,循环就会准备就绪。我的问题是,一次运行此代码多个小时会导致内存最终耗尽吗?由于“while”循环非常短并且基本上不停地运行,我认为这可能是个问题。如果这可能是问题的原因,是否有人对如何改进代码有任何建议,以免调用内存不足 killer ?

非常感谢。

最佳答案

您描述的内存不足的唯一方法是随着时间的推移使用越来越多的内存。此处的循环展示了这种行为,因此它不能(单独)对任何内存错误负责。运行紧密的无限循环会消耗大量不必要的处理器周期,但它本身不会导致 MemoryError,除非它正在将数据存储到其他地方。

很可能在您的代码中的其他地方,您保留了一些您不打算保留的变量。这称为内存泄漏,您可以使用 memory profiler寻找这种泄漏的来源。

一些可能的嫌疑人是用于提高性能的缓存方法,或从不离开范围的变量列表。也许您的多处理队列正在保留对早期数据对象的引用,或者项目一旦插入就永远不会从队列中删除? (考虑到您使用内置 queue.Queue 显示的代码,后一种情况不太可能发生,但一切皆有可能)。

关于python - 为运行多处理队列的 python 脚本激活内存不足 killer ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073815/

相关文章:

python - Django - 使用配置文件扩展用户模型,但也使用不同的用户类型

java - 当另一端无法接收时处理队列中的项目

vba - Excel VBA "Out of Memory"调试技巧

c# - 当应用程序未使用那么多内存时如何获得 System.OutOfMemoryException

python - 多处理——使用管理器命名空间来节省内存

python - 按行打印字典

python - 未调整大小的对象的 len() - cvxpy - 相关性最大化

python - 为什么我的父类(super class)调用我的子类方法?

java - 如何创建 Java 并发队列,以便我们可以在单次调用中阻塞获取超过 1 个元素?

image - Tensorflow、train_step 馈送不正确