如何解决使用 cython 和指向内存起始地址的指针更改不可变的等离子存储 numpy 对象
我使用 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堆内存中,并且修改数组不会反映到访问相同对象引用的其他工作人员。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。