在多处理进程之间如何共享大的只读Numpy数组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我有一个60 GB的SciPy阵列(矩阵),我必须在5+之间共享multiprocessingProcess物品。几个具体问题:

  1. 把sharedmem句柄传递给子的最好方法是什么?Process()埃斯?我需要一个队列来传递一个数组吗?管子会更好吗?我可以把它作为一个参数传递给Process()子类的init(我假设它是腌制的)?
  2. 在我上面链接的讨论中,提到了numpy-sharedmem不安全吗?我肯定使用的是一些不适合32位的结构。
  3. 有权衡的余地吗?RawArray()接近?慢点,巴格?
  4. 对于numpy-sharedmem方法,我需要从Ctype到dtype映射吗?
  5. 有人有这样做的一些开源代码的例子吗?我是一个很有经验的人,如果没有任何好的例子,我很难让这个工作成功。

这需要在UbuntuLinux上运行,并且也许吧Mac操作系统,但可移植性不是一个大问题。

提问于
用户回答回答于

#!/usr/bin/env python
from multiprocessing import Process
import sharedmem
import numpy

def do_work(data, start):
    data[start] = 0;

def split_work(num):
    n = 20
    width  = n/num
    shared = sharedmem.empty(n)
    shared[:] = numpy.random.rand(1, n)[0]
    print "values are %s" % shared

    processes = [Process(target=do_work, args=(shared, i*width)) for i in xrange(num)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

    print "values are %s" % shared
    print "type is %s" % type(shared[0])

if __name__ == '__main__':
    split_work(4)

输出量

values are [ 0.81397784  0.59667692  0.10761908  0.6736734   0.46349645  0.98340718
  0.44056863  0.10701816  0.67167752  0.29158274  0.22242552  0.14273156
  0.34912309  0.43812636  0.58484507  0.81697513  0.57758441  0.4284959
  0.7292129   0.06063283]
values are [ 0.          0.59667692  0.10761908  0.6736734   0.46349645  0.
  0.44056863  0.10701816  0.67167752  0.29158274  0.          0.14273156
  0.34912309  0.43812636  0.58484507  0.          0.57758441  0.4284959
  0.7292129   0.06063283]
type is <type 'numpy.float64'>

相关问题可能有用。

用户回答回答于

示例代码:

from multiprocessing import Process
from numpy import random


global_array = random.random(10**4)


def child():
    print sum(global_array)


def main():
    processes = [Process(target=child) for _ in xrange(10)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()


if __name__ == "__main__":
    main()

扫码关注云+社区