在类中的进程之间共享大数据

时间:2014-02-21 00:16:22

标签: python numpy multiprocessing

我试图在使用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

我知道这是一种进行多重处理的黑客方式,理论上你不应该在课堂上这样做,并且应该通过检查你是否在主要方面来保护...任何替代方案或建议?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

代码留给读者练习,但我可能会尝试破解:)