임의의 길이의 반환 형식화 된 MemoryView 그것에 대한 수천 번의 테스트를 통해 Segmentation fault (core dumped)
오류가 발생하기 시작했습니다. 이것이 메모리 관리 문제라는 것을 알았지 만, 함수에서 반환 된 형식화 된 memoryview의 메모리를 관리하는 방법의 예제를 찾을 수 없습니다. 내가 찾은 유일한 유용한 정보는 result_arr
의 수명을 파이썬 개체에 묶고 __dealloc__
메서드를 사용하여 메모리를 확보 할 것을 권장하는 memory allocation에 있습니다.사이 썬 나는 같은 길이의 형식화 된 Memoryview를 인수로 번호 목록/입력 memoryview를 받아 반환하는 사이 썬 기능을 작성했습니다
메모리를 할당 해제하기위한 파이썬 클래스 생성을 포함하지 않는 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