Python共享内存数组,没有属性get_obj()

Jzl*_*325 5 python ctypes numpy multiprocessing

我正在使用多处理模块操作numpy数组,并且遇到了一些问题,尝试了我在这里运行的一些代码.具体来说,我从一个numpy数组创建一个ctypes数组,然后尝试将ctypes数组返回到一个numpy数组.这是代码:

    shared_arr = multiprocessing.RawArray(_numpy_to_ctypes[array.dtype.type],array.size)
Run Code Online (Sandbox Code Playgroud)

我不需要任何类型的同步锁,所以我使用的是RawArray.基于输入数组的dtype从字典中提取ctypes数据类型.这非常有效.

    shared_arr = numpy.ctypeslib.as_array(shared_arr.get_obj())
Run Code Online (Sandbox Code Playgroud)

在这里,我得到一个堆栈跟踪说明:

    AttributeError: 'c_double_Array_16154769' object has no attribute 'get_obj'
Run Code Online (Sandbox Code Playgroud)

我也从这篇文章中尝试了以下内容,但得到了相同的错误.

    def tonumpyarray(shared_arr):
        return numpy.frombuffer(shared_arr.get_obj())  
Run Code Online (Sandbox Code Playgroud)

我被困在运行python 2.6并且不知道这是否是问题,如果这是共享变量名称的问题(我试图尽可能低地保持内存使用并且我试图不复制numpy数组和ctypes因为我刚学习python的这个组件,所以在内存中的数组).

建议?

HYR*_*YRY 8

由于你使用RawArray,它只是一个从共享内存分配的ctypes数组,没有包装对象,所以你不需要get_obj()方法来获取包装对象:

>>> shared_arr = multiprocessing.RawArray("d",10)
>>> t = np.frombuffer(shared_arr, dtype=float)
>>> t[0] = 2
>>> shared_arr[0]
2.0
Run Code Online (Sandbox Code Playgroud)