我想在多个进程之间共享numpy数组。有工作解决方案here。然而,它们都通过继承将数组传递给子进程,这对我不起作用,因为我必须事先启动一些工作进程,而且我不知道我将要处理多少个数组。上。有没有办法在进程启动后创建这样的数组并通过队列将这些数组传递给进程?
因为某些原因,我无法使用multiprocessing.Manager
。
答案 0 :(得分:1)
您应该使用shared memory,它可以完全解决您的用例。您可以保持内存的读写速度,所有进程都可以在共享内存中的阵列中读写,而不会产生任何序列化或传输成本。
下面是来自官方python文档的示例:
>>> # In the first Python interactive shell
>>> import numpy as np
>>> a = np.array([1, 1, 2, 3, 5, 8]) # Start with an existing NumPy array
>>> from multiprocessing import shared_memory
>>> shm = shared_memory.SharedMemory(create=True, size=a.nbytes)
>>> # Now create a NumPy array backed by shared memory
>>> b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
>>> b[:] = a[:] # Copy the original data into shared memory
>>> b
array([1, 1, 2, 3, 5, 8])
>>> type(b)
<class 'numpy.ndarray'>
>>> type(a)
<class 'numpy.ndarray'>
>>> shm.name # We did not specify a name so one was chosen for us
'psm_21467_46075'
>>> # In either the same shell or a new Python shell on the same machine
>>> import numpy as np
>>> from multiprocessing import shared_memory
>>> # Attach to the existing shared memory block
>>> existing_shm = shared_memory.SharedMemory(name='psm_21467_46075')
>>> # Note that a.shape is (6,) and a.dtype is np.int64 in this example
>>> c = np.ndarray((6,), dtype=np.int64, buffer=existing_shm.buf)
>>> c
array([1, 1, 2, 3, 5, 8])
>>> c[-1] = 888
>>> c
array([ 1, 1, 2, 3, 5, 888])
>>> # Back in the first Python interactive shell, b reflects this change
>>> b
array([ 1, 1, 2, 3, 5, 888])
>>> # Clean up from within the second Python shell
>>> del c # Unnecessary; merely emphasizing the array is no longer used
>>> existing_shm.close()
>>> # Clean up from within the first Python shell
>>> del b # Unnecessary; merely emphasizing the array is no longer used
>>> shm.close()
>>> shm.unlink() # Free and release the shared memory block at the very end
对于像您这样的实际用例,您需要使用shm.name
或任何其他多处理通信机制来传递名称Pipe
。注意,只需要在进程之间交换这个很小的字符串即可;实际数据保留在共享内存空间中。
答案 1 :(得分:0)
根据您的确切用例,对要传输的阵列使用np.memmap
可能是一个不错的选择。数据将存储在磁盘上,但其使用方式类似于标准数组,并且队列中仅对“标头”数据进行了腌制,因此速度非常快。
请参见https://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html