Cポインタを含むcythonクラスに対して__reduce__()
メソッドを記述しようとしていますが、これを行う最善の方法についての情報はほとんど見つかりませんでした。 numpy配列をメンバーデータとして使用する場合、__reduce__()
メソッドを正しく記述する方法については、数多くの例があります。彼らはいつもPythonオブジェクトとして格納され、Python APIとの間でコールを必要とするように、Numpy配列から離れていたいと思います。私はCのバックグラウンドから来ていますので、malloc()
とfree()
への呼び出しを使って手動でメモリを操作するのがとても快適で、pythonのやりとりを絶対最小限に抑えようとしています。Cのポインタを使ったPickle Cythonクラス
しかし、私は問題に遭遇しました。私は、最終的に使用されるPythonスクリプトから、私が作成しているクラスでcopy.deepcopy()
に相当するものを使用する必要があります。私はこれを行う唯一の良い方法は、__reduce__()
メソッドを実装してクラスのpickleプロトコルを実装することであることがわかりました。ほとんどのプリミティブやPythonオブジェクトではこれは簡単です。しかし、動的に割り当てられたC配列に対してこれを行う方法については、私は絶対的な犠牲を払っています。明らかに、オブジェクトが再構築されるまでに、基礎となるメモリが消えてしまうので、ポインタそのものを返すことができないので、これを行うにはどうすればよいでしょうか?これは、__reduce__()
メソッドと、__init__()
メソッドのいずれかまたは両方の変更が必要になると確信しています。
私は、ピクチャリング拡張タイプfound hereのほか、ちょうどthis questionのようなcythonクラスを選ぶことに関するスタックオーバーフローに関する他のすべての質問を読んでいます。
私のクラスの要約版は、次のようになります。
cdef class Bin:
cdef int* job_ids
cdef int* jobs
cdef int primitive_data
def __cinit__(self):
self.job_ids = <int*>malloc(40 * sizeof(int))
self.jobs = <int*>malloc(40 * sizeof(int))
def __init__(self, int val):
self.primitive_data = val
def __dealloc__(self):
free(job_ids)
free(jobs)
def __reduce__(self):
return (self.__class__, (self.primitive_data))
また、私はこの質問を読んだが、それは直接の配列にCポインタを_pickling_には適用されません。 [Cython - ポインタを配列に変換してPythonオブジェクトにする](http://stackoverflow.com/questions/5271690/cython-converting-pointers-to-arrays-into-python-objects?rq=1) –
私はあなたが必要と思うデータをPythonの 'bytes'オブジェクトに直列化します。次に、リビルド機能(例:http://stackoverflow.com/a/12647497/1300519)を使用してint配列にキャストし直します。私はまだこれを自分自身で動かすことはできませんでしたが、これは正しいアプローチだと私は信じています。私は実際の例があるまで答えとしてこれを掲示しない。 – Snorfalorpagus