【发布时间】:2013-07-01 18:04:51
【问题描述】:
我已将一段代码缩小到以下最小(工作?)示例:
import multiprocessing
def f(x): return x**2
for n in xrange(2000):
P = multiprocessing.Pool()
sol = list(P.imap(f, range(20)))
当我在我的计算机(Ubuntu 12.04,8 核)上运行它时,python 继续消耗所有可用内存,最终由于交换无响应而挂起系统。我听说 Python 在完成之前不会释放内存,但我认为这个程序应该消耗超过 8Gb 的 RAM 有点愚蠢。如果我想一遍又一遍地创建multiprocessing.Pool 对象,如何在不每次都重新分配新内存的情况下这样做?
【问题讨论】:
-
您正在尝试启动 2000 个进程池,每个进程池有 8 个工作人员。那是 16k 进程...你用完资源一点也不奇怪。
-
另外,Python 使用引用计数和垃圾收集来释放内存...绝对不是:“在完成之前不会释放内存”
-
我有点惊讶内存是问题而不是其他资源,因为 linux 会进行 CoW 分叉,所以 forkbomb 可以走得足够远,在调度程序或其他内核资源得到之前淹没接近颠簸交换......
-
附带说明,您为什么要调用
P.imap只是为了将其传递给list?这只是调用P.map的一种效率较低的方式。
标签: python memory-leaks multiprocessing