数値のリスト/型付きメモリビューを引数として取り、同じ長さの型付きメモリビューを返す Cython 関数を作成しました。
def test(list_data):
cdef unsigned int n = len(list_data)
cdef unsigned int i = 0
cdef double *results_arr = <double*>malloc(n* sizeof(double) )
cdef double[:] results = <double[:n]>results_arr
for i in range(n):
results[i] = 220 - list_data[i]
return results
数千回のテストを実行した後、Segmentation fault (core dumped)
エラーが発生し始めました。これはメモリ管理の問題であることは認識していますが、関数によって返される型指定されたメモリビューのメモリを管理する方法の例が見つかりません。私が見つけた唯一の役立つ情報は、メモリ割り当てに関するresult_arr
もので、のライフタイムをPython オブジェクトに結び付け、__dealloc__
メソッドを使用してメモリを解放することを推奨しています。
メモリの割り当てを解除するための python クラスの作成を伴わないメモリビュー ガベージ コレクションを管理する方法はありますか?
編集:これを試してみましたが、正しい方法でメモリを解放しているようです。
def test(list_data):
cdef unsigned int n = len(list_data)
cdef unsigned int i = 0
cdef double *arr = <double*>malloc(n* sizeof(double) )
if not arr:
raise MemoryError()
cdef double[:] results = <double[:n]>arr
for i in range(n):
results[i] = 220 - list_data[i]
free(arr)
return results
なぜこれが機能し、メモリを管理するためのより良い方法がありますか?