【发布时间】:2014-12-05 19:15:33
【问题描述】:
我想在多个进程之间共享一个 numpy 数组。进程只读取数据,所以我想避免复制。如果我可以从multiprocessing.sharedctypes.RawArray 开始,然后使用numpy.frombuffer 创建一个numpy 数组,我知道该怎么做。但是如果我最初得到一个 numpy 数组怎么办?有没有办法用 numpy 数组的数据初始化 RawArray 而无需复制数据?还是有其他方法可以在不复制的情况下跨进程共享数据?
【问题讨论】:
-
我不确定这是否可能 -
numpy数组不会从共享内存中分配。我不认为您可以在不将数据实际复制到共享内存空间的情况下创建sharedctypes.RawArray。 The docs 请注意,您可以只将指向对象的指针存储在共享内存中,但它可能在第二个进程中无效,因为它指向另一个进程的地址空间。 -
@christianmbrodbeck this answer 解释了如何使用 Cython 和 OpenMP 通过使用共享内存的不同进程在同一个数组上工作
-
感谢@saullo-castro 的指点。由于在 OS X 上尝试此解决方案似乎存在一些障碍(据我所知,Xcode 不支持 openmp)它是否值得在大型阵列上执行相对简单的操作?不是每个 prange 语句都会产生创建子进程的开销吗?示例中的点积似乎并没有从中受益。 (即我假设 prange 语句必须是最佳速度增益的最外层循环?)
-
@christianmbrodbeck 是的,
prange会产生一些开销,如果您创建 static threads,这些开销就会最小化。你是对的...in this exampleprange已经在最外层循环了 -
谢谢@saullo-castro,假设我的目标函数是您的示例中的
dot(),并且我将多次从Python调用dot(),是否可以避免与相关的开销在每次调用中初始化子进程?或者这基本上需要在 Cython 中实现外循环?
标签: python arrays numpy multiprocessing