メモリ ビューの代わりに実際の配列を渡すと、問題が解決する場合があります。関数を並行して実行したい場合、正しく思い出せば、そのすべてのパラメーターをピクル可能にする必要があります。少なくとも python multiprocessing の場合はそうです。したがって、配列を関数に渡して、関数内にメモリビューを作成できます。
def some_function(matrix_as_array):
cdef double[:,:] matrix = matrix_as_array
...
参考になるかどうかわかりませんが、似たような問題に遭遇しました。cdef クラスの属性としてメモリビューを使用します。クラスのインスタンスを正しく unpickle するには、独自のメソッドを作成__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__
callable ( ) で構成されるFoo
タプル、その callable のパラメーターのタプル (つまり、「新しい」Foo インスタンスを作成するために必要なもの、この場合は保存された行列)、および復元に必要なすべての値を含む辞書を返すことに注意してください。実例。