python - 多处理 - 具有多维 numpy 数组的共享内存

标签 python numpy python-multiprocessing

我处于需要并行处理一个非常大的 numpy 数组 (55x117x256x256) 的情况。尝试使用通常的多处理方法传递它会产生 AssertionError,我理解这是因为数组太大而无法复制到每个进程中。因此,我想尝试将共享内存与多处理一起使用。 (我对其他方法持开放态度,只要它们不太复杂)。

我看到了一些关于使用 python 多处理共享内存方法的问题,例如

import numpy as np
import multiprocessing as mp

unsharedData = np.zeros((10,))
sharedData = mp.Array('d', unsharedData)

这似乎工作正常。但是,我还没有看到使用多维数组完成此操作的示例。

我试过将多维数组粘贴到 mp.Array 中,这给了我 TypeError: only size-1 arrays can be converted to Python scalars
unsharedData2 = np.zeros((10,10))
sharedData2 = mp.Array('d', unsharedData2)## Gives TypeError

我可以展平阵列,但如果可以避免,我宁愿不这样做。

是否有一些技巧可以让多处理数组处理多维数据?

最佳答案

您可以使用 np.reshape((-1,))np.ravel而不是 np.flatten制作一维 view的阵列,没有不必要的复制扁平化:

import numpy as np
import multiprocessing as mp

unsharedData2 = np.zeros((10, 10))
ravel_copy = np.ravel(unsharedData2)
reshape_copy2 = unsharedData2.reshape((-1,))
ravel_copy[11] = 1.0       # -> saves 1.0 in unsharedData2 at [1, 1]
reshape_copy2[22] = 2.0    # -> saves 2.0 in unsharedData2 at [2, 2]
sharedData2 = mp.Array('d', ravel_copy)
sharedData2 = mp.Array('d', reshape_copy2)

关于python - 多处理 - 具有多维 numpy 数组的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50270346/

相关文章:

python - 插入是否最优?

python - 使用 numpy 的矩阵的条件数

python - 显示 3d ndarray 中的切片

python-3.x - concurrent.futures.ProcessPoolExecutor() 的 Python : Get multiple return values and provide multiple arguments in executor. 映射

python - 当只应该存在一个窗口时,Tkinter 在使用多重处理选择文件时打开多个 GUI 窗口

python - 我正在尝试网络抓取,但得到的是函数而不是实际数据

python - 如何获取满足条件的多个列索引

python - 实时能力 python 多处理(队列和管道)

python - 如何从 Flask 中运行 python 脚本

python - 最近的交叉点到 python 中的多条线