我寫了一個用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__
方法釋放內存。
有沒有辦法管理memoryview垃圾回收,不涉及創建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
爲什麼這個工作,並有一個更好的方法來管理內存?
請參閱https://cython.readthedocs.io/en/stable/src/userguide/memoryviews.html#cython-arrays和'.callback_free_data' – DavidW