메모리보기 대신 실제 배열을 전달하면 문제가 해결 될 수 있습니다. 함수를 병렬로 실행하려면 올바르게 호출하면 모든 매개 변수를 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
)로 구성된 튜플하는 '새로운'푸 인스턴스를 만드는 데 필요한 것, 즉 그 호출에 대한 매개 변수 (의 튜플에 이 경우 저장된 행렬) 및 인스턴스를 복원하는 데 필요한 모든 값이 들어있는 사전으로 구성됩니다.
자세한 정보가 필요합니다. – akaRem