我试图在使用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
我知道这是一种进行多重处理的黑客方式,理论上你不应该在课堂上这样做,并且应该通过检查你是否在主要方面来保护...任何替代方案或建议?
答案 0 :(得分:1)
您可以将数据从调用者序列化到磁盘,并将文件名传递给工作进程吗?如果响应可能很大,则worker可以序列化它并将文件名返回给调用者。这是我在处理大型数据集时使用的。
答案 1 :(得分:1)
我认为你应该使用二进制/紧凑内存布局和mmap
专门用于numpy
数组。
代码留给读者练习,但我可能会尝试破解:)