共享非连续访问的 Numpy 数组

5 投票
1 回答
615 浏览
提问于 2025-04-17 08:27

我有一个numpy数组,想在多个Python进程之间共享,但不想复制这个数组。我是通过使用sharedmem这个包,从一个已有的numpy数组创建了一个共享的numpy数组。

import sharedmem as shm
def convert_to_shared_array(A):
    shared_array = shm.shared_empty(A.shape, A.dtype, order="C")
    shared_array[...] = A
    return shared_array

我的问题是,每个子进程需要访问数组中随机分布的行。目前,我是用sharedmem包创建了一个共享的numpy数组,并把它传递给每个子进程。每个进程还有一个列表idx,里面是它需要访问的行。但是在子进程中,当我这样做的时候:

#idx = list of randomly distributed integers

local_array = shared_array[idx,:]

# Do stuff with local array

它会创建一个数组的副本,而不是仅仅生成另一个视图。这个数组非常大,提前处理一下再共享,让每个进程访问连续的行,比如:

local_array = shared_array[start:stop,:]

这样做太慢了。

问题是:有什么好的方法可以在Python进程之间共享对numpy数组的随机访问,而不涉及复制数组呢?

子进程只需要只读访问(所以不需要在访问时加锁)。

1 个回答

1

花哨的索引会导致数据的复制,所以如果你想避免复制,就要尽量避免使用花哨的索引,这是没有其他办法的。

撰写回答