2013-12-18 27 views
2

我有一个使用memoryview阵列,这是一个用Cython模块...为什么cython内存视图不能被腌制?

double[:,:] foo 

我要运行并行使用多这个模块。但我得到的错误:

PicklingError: Can't pickle <type 'tile_class._memoryviewslice'>: attribute lookup tile_class._memoryviewslice failed 

为什么我不能pickle一个内存视图,我该怎么办。

+0

需要更多信息。 – akaRem

回答

0

也许传递实际数组而不是内存视图可以解决您的问题。 如果你想并行执行一个函数,如果我记得正确的话,它的所有参数都必须是可选择的。至少python多处理就是这种情况。所以你可以将数组传递给函数,并在函数内部创建内存视图。

def some_function(matrix_as_array): 
    cdef double[:,:] matrix = matrix_as_array 
    ... 

我不知道这是否有助于您,但我遇到了类似的问题。我使用一个memoryview作为cdef类中的一个属性。我不得不写我自己的__reduce____setstate__方法来正确取消我的课程的实例。通过使用numpy.asarray将内存视图作为数组进行酸洗并在__setstate__中恢复为我工作。我的代码的简化版本:

import numpy as np 

cdef class Foo: 
    cdef double[:,:] matrix 

    def __init__(self, matrix): 
     '''Assign a passed array to the typed memory view.''' 
     self.matrix = matrix 

    def __reduce__(self): 
     '''Define how instances of Foo are pickled.''' 
     d=dict() 
     d['matrix'] = np.asarray(self.matrix) 
     return (Foo, (d['matrix'],), d) 

    def __setstate__(self, d): 
     '''Define how instances of Foo are restored.''' 
     self.matrix = d['matrix'] 

注意__reduce__回报包括一个可调用(Foo)一个元组,来创建一个“新”富例如什么是需要的是可调用的参数(即一个元组,在这种情况下保存的矩阵)和具有恢复实例所需的所有值的字典。

相关问题