Python 在类内的进程之间共享大型数据

Python 在类内的进程之间共享大型数据,python,numpy,multiprocessing,Python,Numpy,Multiprocessing,我正在尝试使用pool.imap_unordered在进程之间共享一个大的numpy数组。这应该很容易,但我试着在课堂上做。现在我每次都在传递数据,一切都正常,直到数据变得足够大,池挂起,无法启动并行进程。由于每个并行进程只需要大数据的一个子集,另一种方法是只传递一个子集,但我不知道如何在我当前的框架中传递 由于用于多处理的函数必须在全局名称空间中,因此我将我的函数放在类之外,如下所示(真实问题的玩具示例): 我知道这是一种做多处理的黑客方法,理论上你不应该在一个类中做,应该通过检查你是否在主。

我正在尝试使用pool.imap_unordered在进程之间共享一个大的numpy数组。这应该很容易,但我试着在课堂上做。现在我每次都在传递数据,一切都正常,直到数据变得足够大,池挂起,无法启动并行进程。由于每个并行进程只需要大数据的一个子集,另一种方法是只传递一个子集,但我不知道如何在我当前的框架中传递

由于用于多处理的函数必须在全局名称空间中,因此我将我的函数放在类之外,如下所示(真实问题的玩具示例):


我知道这是一种做多处理的黑客方法,理论上你不应该在一个类中做,应该通过检查你是否在主。。。有其他选择或建议吗?

能否将调用者的数据序列化到磁盘,然后将文件名传递给工作进程?如果响应可能很大,那么工作者可以序列化它并将文件名返回给调用者。这就是我在处理大型数据集时使用的方法。

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


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

谢谢,那完全可以。我希望有一个少一些“黑客”然而。总的来说,对于使用classesI的多处理接口,我有点失望。我重新考虑了这个问题,我不确定这是否可行,因为每个实例都必须在某个点加载数据,这会导致RAM过载。还有其他建议吗?多处理允许您使用共享内存,如果您必须让多个进程同时访问同一个大内存结构,这似乎是唯一可能的解决方案。但这似乎是一个奇怪的要求。您可以让调用方序列化到磁盘,从内存中卸载,让工作人员从磁盘加载,执行工作并写入磁盘,从内存中卸载,等等。这样,任何给定数据集的一个副本在任何时候都将在内存中。谢谢!这太完美了。我认为一个小小的改进是专门使用numpy.memmap,而不是python的mmap.oh 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