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

时间:2012-07-27 18:35:40

标签: python numpy multiprocessing ctypes

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

    shared_arr = multiprocessing.RawArray(_numpy_to_ctypes[array.dtype.type],array.size)

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

    shared_arr = numpy.ctypeslib.as_array(shared_arr.get_obj())

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

    AttributeError: 'c_double_Array_16154769' object has no attribute 'get_obj'

我还尝试了this post中的以下内容,但得到了相同的错误。

    def tonumpyarray(shared_arr):
        return numpy.frombuffer(shared_arr.get_obj())  

我被困在运行python 2.6并且不知道这是否是问题,如果它是共享变量名的问题(我试图尽可能低地保持内存使用率并且我试图不复制numpy数组和内存中的ctypes数组,或其他东西,因为我只是在学习python的这个组件。

建议?

1 个答案:

答案 0 :(得分:7)

由于你使用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