numpy矩阵到共享数组进行多处理

时间:2014-02-03 08:12:24

标签: python multiprocessing python-multithreading

矩阵Z的定义如下:

N = 15
Z = np.zeros((N, N))

我希望不同的线程填充它,所以我需要创建一个共享内存矩阵或数组。我这样做:

Z_shared = Array('d', Z)

但是我收到了这个错误:

TypeError: only length-1 arrays can be converted to Python scalars

我认为这意味着Array不接受矩阵。是否有另一个功能可以完成我需要的功能,或者我应该先将Z转换为矢量然后将其传递给Array。如果是这样,有一个功能可以为我做这个。我不想循环Z,因为N可能非常大。

我在另一个被调用的函数中填充Z_shared:

from multiprocessing import Pool, Array
pool = Pool(processes=1)

def foo(data):
    x, y, val = data
    Z_shared[x][y] = val
pool.map(fooe, DATA)

'data'是索引和值的元组,'DATA'是元组的列表。

谢谢

1 个答案:

答案 0 :(得分:0)

严格地回答这个问题,如果Array构造的对象就像一个列表,你可以像这样复制所有内容:

Z_shared = Array('d', Z.size)
Z_shared[:] = Z.reshape((-1)) # copy entrywise
但是,这似乎很糟糕。首先,共享数组不具有ndarray语义,并且将是一个副本。它真的需要是一个共享变量吗?


你在程序中分成N * N个进程,其中N可能很大。制作新工艺可能很昂贵。我认为你应该只分割成拥有核心的进程。

所以我的想法是,基于x坐标分割数据,并有一个处理矩阵的上半部分,另一个处理下半部分。两者都是共享内存中的独立数组。


在阅读您的问题时,您不应该首先使用多处理(过早优化!)。相反,请查看稀疏矩阵:http://docs.scipy.org/doc/scipy/reference/sparse.html