使用 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堆内存中,并且修改数组不会反映到访问相同对象引用的其他工作人员。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...