我正在64位Xubuntu 14.04 LTS和Python 2.7.6 上运行以下代码
import numpy
import multiprocessing
def f(i):
result = numpy.zeros((224, 244, 3), dtype='float32')
return result
if __name__ == '__main__':
print 'Start...'
for i in xrange(100):
print 'Attempt:', i
args = [0] * 1000
pool = multiprocessing.Pool(8)
v = pool.map(f, args)
print 'Pool done.'
import gc
gc.collect()
del v
v = None
print 'Clean done.'
令人惊讶的是,它在几次迭代中就消耗掉了我机器上所有的16 Gb。它完全冻结了系统。据我所知,这不应该发生,因为"v"是本地资源,它可以被释放。
那么,为什么会发生这种"内存泄漏"呢?
多处理版本为0.70a1,numpy-1.10.4
在清理部分中调用pool.close()
就足以修复内存泄漏,而无需显式地求助于垃圾收集器。至于为什么会发生这种情况,我不知道,但这肯定取决于池是如何实现的(很可能它在某个地方保留了对结果的引用)