【问题标题】:Does python's multiprocessing leak memory?python的多处理是否泄漏内存?
【发布时间】: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


【解决方案1】:

您在每次循环迭代时都创建一个新的多处理池 - 您不只想要一个池来提供您的处理作业吗?

import multiprocessing

def f(x): return x**2

P = multiprocessing.Pool()
for n in xrange(2000):
    sol = list(P.imap(f, range(20)))

【讨论】:

  • 另请注意,如果未给出明确的进程数,multiprocessing.Pool() 会创建一个大小为 cpu_count 的池。
猜你喜欢
  • 2016-08-10
  • 2012-10-19
  • 2020-02-29
  • 2018-12-18
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多