3

memoryview 配列を使用する cython モジュールがあります。つまり...

double[:,:] foo

マルチプロセッシングを使用して、このモジュールを並行して実行したいと考えています。ただし、次のエラーが表示されます。

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

メモリ ビューをピクルできないのはなぜですか。また、それに対して何ができますか。

4

1 に答える 1

2

メモリ ビューの代わりに実際の配列を渡すと、問題が解決する場合があります。関数を並行して実行したい場合、正しく思い出せば、そのすべてのパラメーターをピクル可能にする必要があります。少なくとも 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 インスタンスを作成するために必要なもの、この場合は保存された行列)、および復元に必要なすべての値を含む辞書を返すことに注意してください。実例。

于 2014-03-07T14:10:49.570 に答える