在 Numpy/Scipy 中通过管道或流式传输数组的方式
Way to pipe or stream Array in Numpy/Scipy
这是我的具体用例,可以更好地解释问题,但我正在寻找一个通用的解决方案。
我正在使用 Raspberry Pi 与显示 RGB 矩阵的 adafruit LED 显示器(此代码在 Python 2 中)。我有一个 python 脚本,每 1/n 秒生成一次 RGB 数据。
是否有一个包或库允许我在一个进程中以 np.ndarray 的形式连续生成 RGB 数据,并让矩阵脚本轮询它,以便它近乎实时地执行numpy 数组的进程间通信。
一个简单快捷的解决方案是使用 numpy.memmap
library。它只是创建一个内存映射到存储在磁盘上二进制文件中的数组。通过这种方式,您可以非常轻松且非常快速地在进程之间共享 numpy 数组。
例如生成RGB数据的主进程可以是:
import numpy as np
myshape = (100,100,3) # my RGB array
shared_array = np.memmap("/tmp/testarray", mode='w+', shape=myshape)
while True:
data = some_function_to_get_rgb_data() # returns a numpy array of myshape
shared_array[:] = data[:]
读取该数组的另一个进程可以是:
import numpy as np
read_shape = (100,100,3)
shared_array = np.memmap("/tmp/testarray", mode='r', shape=read_shape)
while True:
# shared_array will behave as a numpy ndarray
do_something_with_array(shared_array)
只考虑形状必须匹配(数组的dtype
也可以传递给memmap
函数)和创建文件的过程必须运行第一的。实际上,在主进程中对 shared_array
所做的任何更改都会非常快速地反映在其他进程中。
我完成的测试同时与 4 个进程共享一个 (480,360,21) 数组,从该数组读取和写入不到 1 毫秒。
这是我的具体用例,可以更好地解释问题,但我正在寻找一个通用的解决方案。
我正在使用 Raspberry Pi 与显示 RGB 矩阵的 adafruit LED 显示器(此代码在 Python 2 中)。我有一个 python 脚本,每 1/n 秒生成一次 RGB 数据。
是否有一个包或库允许我在一个进程中以 np.ndarray 的形式连续生成 RGB 数据,并让矩阵脚本轮询它,以便它近乎实时地执行numpy 数组的进程间通信。
一个简单快捷的解决方案是使用 numpy.memmap
library。它只是创建一个内存映射到存储在磁盘上二进制文件中的数组。通过这种方式,您可以非常轻松且非常快速地在进程之间共享 numpy 数组。
例如生成RGB数据的主进程可以是:
import numpy as np
myshape = (100,100,3) # my RGB array
shared_array = np.memmap("/tmp/testarray", mode='w+', shape=myshape)
while True:
data = some_function_to_get_rgb_data() # returns a numpy array of myshape
shared_array[:] = data[:]
读取该数组的另一个进程可以是:
import numpy as np
read_shape = (100,100,3)
shared_array = np.memmap("/tmp/testarray", mode='r', shape=read_shape)
while True:
# shared_array will behave as a numpy ndarray
do_something_with_array(shared_array)
只考虑形状必须匹配(数组的dtype
也可以传递给memmap
函数)和创建文件的过程必须运行第一的。实际上,在主进程中对 shared_array
所做的任何更改都会非常快速地反映在其他进程中。
我完成的测试同时与 4 个进程共享一个 (480,360,21) 数组,从该数组读取和写入不到 1 毫秒。