2013-12-18 6 views
2

나는 즉, memoryview 배열을 사용하는 사이 썬 모듈 ... 내가 병렬로 사용하여 멀티에서이 모듈을 실행하려는왜 cython 메모리 뷰를 절이 수 없습니까?

double[:,:] foo 

있습니다. 그러나 오류가 발생합니다 :

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

메모리보기를 피할 수없는 이유는 무엇입니까?

+0

자세한 정보가 필요합니다. – akaRem

답변

0

메모리보기 대신 실제 배열을 전달하면 문제가 해결 될 수 있습니다. 함수를 병렬로 실행하려면 올바르게 호출하면 모든 매개 변수를 picklable해야합니다. 적어도 그것은 파이썬 다중 처리의 경우입니다. 따라서 배열을 함수에 전달하고 함수 내부에 memoryview를 만들 수 있습니다.

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

이 방법이 도움이 될지 모르지만 비슷한 문제가 발생했습니다. 나는 memoryview를 cdef 클래스의 속성으로 사용한다. 내 클래스의 인스턴스를 올바르게 unpickle하려면 내 __reduce____setstate__ 메서드를 작성해야했습니다. numpy.asarray을 사용하여 메모리보기를 배열로 pickling하고 __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__ 그 돌려주는, Callable (Foo)로 구성된 튜플하는 '새로운'푸 인스턴스를 만드는 데 필요한 것, 즉 그 호출에 대한 매개 변수 (의 튜플에 이 경우 저장된 행렬) 및 인스턴스를 복원하는 데 필요한 모든 값이 들어있는 사전으로 구성됩니다.