我在 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)
这仍然使用过多的内存,尽管我不知道为什么。