Я написал функцию 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 для освобождения памяти?
Редактировать: Я пробовал это и, кажется, освобождает память в правильном порядке.
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