2014-02-21 154 views
0

我想在使用pool.imap_unordered的进程之间共享一个大的numpy数组。应该很容易,但我试图从。现在我只是每次都传递数据,一切正常,直到数据变得足够大并且池暂停并且不启动并行进程。由于每个并行进程只需要一部分大数据,另一种方法是只传递一个子集,但我不知道如何在当前框架中使用。在一个类中的进程之间共享大数据

由于用于多重功能必须在全局命名空间,我把类的超出了我的功能如下(实际问题的玩具为例):

import numpy as np 
import mutliprocessing.Pool 
import itertools 

def process(args): 
    large_data, index = args 
    return some_costly_operation(large_data[index]) 

class MyClass: 
    def __init__(self): 
     # Let's pretend this is large 
     self.data = np.zeros(10) 

    def do(self): 
     p = Pool() 
     for result in p.imap_unordered(process, 
      itertools.izip(itertools.repeat(self.data), xrange(10)))): 

      print result 

我知道这是一个hack- y方法来做多处理,理论上你不应该在课堂上做到这一点,并应通过检查你是否处于主要地位来保护...任何替代方案或建议?

回答

1

我认为你应该使用二进制/紧凑内存布局和mmap专门为numpy阵列。

作为练习的代码留给读者,但我可能会尝试破解一些东西:)

+0

谢谢!太棒了。我认为稍微改进是专门使用numpy.memmap,而不是python的mmap。 – aleph4

+1

哦numpy现在提供吗?真棒! (我认为它必须使用缓冲区来破解) –

1

您可以将数据序列化到来自调用者的磁盘上,并只传递文件名到工作进程?如果响应可能很大,工作人员可以序列化它并将文件名返回给调用者。这是我在处理大型数据集时使用的。

+0

谢谢,这将完全工作。我希望有一个“黑客”少。总体来说有点失望w/how多处理接口与类 – aleph4

+0

我再次想到了这一点,我不确定这将工作,因为每个实例都必须加载数据在某个点反正 - 导致RAM过载。还有其他建议吗? – aleph4

+1

多处理可让您使用共享内存,这似乎是唯一可行的解​​决方案,如果您必须让多个进程同时访问相同的大内存结构。但这似乎是一个奇怪的要求。您可以让调用者序列化到磁盘,从内存卸载,从磁盘加载工作负载,完成工作并写入磁盘,从内存中卸载等。这样,任何时候只有任何给定数据集的一个副本将在内存中。 –