在没有内存开销的迭代器上正确锁定多处理.Pool

时间:2012-06-26 22:30:06

标签: python parallel-processing multiprocessing

我在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个对象 - 这将保留在内存中(并且我们不需要它!)。
  3. 我尝试了什么

    • 使用全局锁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)
    

    这仍然使用过多的内存,但我不确定原因。

0 个答案:

没有答案