我有一个60GB的SciPy数组(矩阵)我必须在5个以上的multiprocessing Process对象之间共享.我已经看过numpy-sharedmem并在SciPy列表上阅读了这个讨论.似乎有是两个approaches-- numpy-sharedmem和使用multiprocessing.RawArray(),并映射NumPy的dtypes到ctype秒.现在,numpy-sharedmem似乎是要走的路,但我还没有看到一个很好的参考例子.我不需要任何类型的锁,因为数组(实际上是矩阵)将是只读的.现在,由于它的大小,我想避免副本.这听起来像是正确的方法是创建唯一的数组作为副本sharedmem数组,然后将它传递给Process对象?几个具体问题:
将sharedmem句柄实际传递给子的最佳方法是Process()什么?我是否需要一个队列来传递一个阵列?管道会更好吗?我可以将它作为参数传递给Process()子类的init(我假设它被腌制)吗?
在上面我讨论过的讨论中,有人提到numpy-sharedmem不是64位安全吗?我肯定使用一些不是32位可寻址的结构.
这种RawArray()方法是否存在权衡?更慢,更笨?
我是否需要numpy-sharedmem方法的任何ctype-to-dtype映射?
有没有人有一些OpenSource代码这样做的例子?我是一个非常亲力实践的人,如果没有任何好的例子,很难让它工作.
如果我可以提供任何其他信息以帮助其他人澄清这一点,请发表评论,我将添加.谢谢!
这需要在Ubuntu Linux和Maybe Mac OS上运行,但可移植性不是一个大问题.
在python中,可以在多个进程之间共享ctypes对象.但是我注意到分配这些对象似乎非常昂贵.
考虑以下代码:
from multiprocessing import sharedctypes as sct
import ctypes as ct
import numpy as np
n = 100000
l = np.random.randint(0, 10, size=n)
def foo1():
    sh = sct.RawArray(ct.c_int, l)
    return sh
def foo2():
    sh = sct.RawArray(ct.c_int, len(l))
    sh[:] = l
    return sh
%timeit foo1()
%timeit foo2()
sh1 = foo1()
sh2 = foo2()
for i in range(n):
    assert sh1[i] == sh2[i]
输出是:
10 loops, best of 3: 30.4 ms per loop
100 loops, best of 3: 9.65 ms per loop …