私はリストを取りCython機能を書いている/引数として数字のmemoryviewを入力し、同じ長さの型付きMemoryviewを返します。Cython - 任意の長さの戻り型指定されたMemoryView
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)
エラーを取得し始めました。私はこれがメモリ管理の問題であることを認識していますが、関数から返された型付きメモリビューのメモリを管理する方法の例は見つかりません。私が見つけた唯一の有用な情報はmemory allocationで、result_arr
の寿命をPythonオブジェクトに結びつけ、__dealloc__
メソッドを使用してメモリを解放することを推奨しています。
メモリを解放するためのPythonクラスの作成に関係しないmemoryviewガベージコレクションを管理する方法はありますか?
編集: これを試しましたが、正しい方法でメモリを解放しているようです。
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
なぜこれが機能し、メモリを管理する優れた方法がありますか?
https://cython.readthedocs.io/en/stable/src/userguide/memoryviews.html#cython-arraysと '.callback_free_data'を参照してください。 – DavidW