问题描述
我使用 ray.put(large_2d_array)
来存储一个大的 numpy 2D 布尔数组,然后在工作进程中我从这个共享的 numpy 数组中取出一列并将其传递给一个 cython 函数,然后通过 { 创建一个平面缓冲区视图{1}}。使用此视图,我可以修改底层缓冲区(将一些索引设置为 True)。
由于等离子存储对象是不可变的,因此我可能会面临哪些未知问题?
如果有人能对此有所了解,我会很高兴。
代码模板:
cdef cnp.npy_bool view = &sliced_array[0]
P.S:没有两个工作人员可以同时访问同一个切片。每个切片(在本例中为列)仅被访问一次,并且仅被修改/写入一次。
尝试演员方法 这仍然不起作用,我想我没有做错什么。
import numpy as np
# ray init code
......
large_2d_array = np.zeros((6000000000,205),dtype=bool,order='F')
shared_array = ray.put(large_2d_array)
# Call worker via ray remote here and pass the shared_array
......
......
@ray.remote(num_cpus=1)
def worker(large_2d_array,col_idx):
array_slice = large_2d_array[:,col_idx]
cython_function(array_slice)
#In file: cython_func.pyx
def cython_function(cnp.ndarray[cnp.npy_bool,ndim=1,mode='c'] sliced_array):
cdef cnp.npy_bool view = &sliced_array[0]
cdef int i
for i in range(100):
view[i] = True
return
解决方法
我认为在这种情况下,切片数组将被复制到您的python堆内存中,并且修改数组不会反映到访问相同对象引用的其他工作人员。