我在python Z
中有一个可迭代的对象,它可以很大地适应内存。我想对此对象执行并行计算,并将结果(它们出现在Z
中)写入文件。考虑一下这个愚蠢的例子:
import numpy as np
import multiprocessing as mp
import itertools as itr
FOUT = open("test",'w')
def f(x):
val = hash(np.random.random())
FOUT.write("%s\n"%val)
N = 10**9
Z = itr.repeat(0,N)
P = mp.Pool()
P.map(f,Z,chunksize=50)
P.close()
P.join()
FOUT.close()
这有两个主要问题:
N
个对象 - 这将保留在内存中(并且我们不需要它!)。 我尝试了什么:
mp.Lock()
来共享FOUT
资源:没有用,因为我认为每个工作人员都会创建自己的命名空间。apply_async
代替map
:在回调修复1],2]时,它不接受可迭代对象。imap
代替map
并迭代结果:类似的东西:
def f(x):
val = hash(np.random.random())
return val
P = mp.Pool()
C = P.imap(f,Z,chunksize=50)
for x in C:
FOUT.write("%s\n"%x)
这仍然使用过多的内存,但我不确定原因。