3

我在 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()

这样做有两个主要问题:

  1. 多个结果可以写入同一行
  2. 返回一个带有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)

这仍然使用过多的内存,尽管我不知道为什么。

4

0 回答 0