共享非连续访问的Numpy数组

5

我有一个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
不管怎么说,这与共享内存无关。Numpy数组必须在内存中是连续的,因此任何高级索引(例如使用索引数组进行索引)始终返回副本。这对于任何numpy数组都是正确的。要么使用较小的索引块或迭代,而不是切片。 - Joe Kington
@JoeKington - 你说得对。问题一般出现在numpy数组中。 - Anthony Bak
1个回答

1
花式索引会导致复制,因此如果要避免复制,就需要避免使用花式索引,这是无法绕过的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接