2013-12-18 61 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)一個元組,來創建一個「新」富例如什麼是需要的是可調用的參數(即一個元組,在這種情況下保存的矩陣)和具有恢復實例所需的所有值的字典。

相關問題