【发布时间】:2014-03-31 04:41:04
【问题描述】:
我编写了一个 python 程序,需要一次运行多天,因为不断收集数据。以前我一次运行这个程序几个月都没有问题。我最近对程序进行了一些更新,现在大约 12 小时后,我得到了可怕的内存不足杀手。 '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'循环非常短并且基本上不间断地运行,我认为这可能是一个问题。如果这可能是问题的原因,是否有人对如何改进代码以使内存不足杀手不被调用有任何建议?
非常感谢。
【问题讨论】:
-
if q.empty(): pass是编写该块的惯用方式。但最好只使用if not q.empty(): fr = q.get()。 -
你使用的是什么实现?
.get()是从队列中删除元素还是只检查它?在后一种情况下,队列的大小是单调递增的。 -
您是否启用了交换?
free的输出是什么? -
感谢所有 cmets。我使用 .get() 的方式是从队列中删除一个列表。所以我在主程序中使用 .put() 将列表发送到并行进程,而 .get() 是它的选择。我之前假设输入.get()后,队列被清除,但也许我错了。
-
我前段时间停止运行程序,但这里是 'free' 的当前输出:total used free shared buffers cached Mem: 8177396 1659060 6518336 0 255036 560160 -/+ buffers/cache: 843864 7333532 交换:10027004 869020 9157984
标签: python queue out-of-memory multiprocessing kill-process