2012-01-10 1 views
3

This bug report은 2007 년 6 월의 Python 인터프리터가 Python 인터프리터가 포함 된 C/C++ 응용 프로그램에서 Py_Finalize를 호출 한 후 할당 된 메모리를 모두 정리하지 않는다고 말합니다. 응용 프로그램 종료시 Py_Finalize를 한 번 호출하는 것이 좋습니다.임베디드 될 때 파이썬 3 인터프리터가 메모리를 누설합니까?

This bug report은 버전 3.3 및 2011 년 3 월 시점에서 여전히 메모리가 누수됨을 나타냅니다.

누구든지이 문제의 현재 상태를 알고 있습니까? 인터프리터가 실행중인 인스턴스마다 여러 번 호출되고 메모리 누수가 발생하는 응용 프로그램이 있기 때문에 걱정됩니다.

이미 참조 횟수를 처리하기 위해 boost :: python을 사용하고 있으며, 실행 사이에 Python 프로그램을 실행하여 작성한 모든 참조의 전역 사전을 지 웁니다. 나는 싱글 톤 클래스를 가지고있다 - 이것이 문제 일까?

이것은 다루기 어려운 문제입니까, 아니면 파이썬 인터프리터의 버그입니까?

답변

4

버그 (처음부터 2007 년까지)가 nnorwitz에 의해 "wontfix"로 닫히고 그의 게시물이 버그 리포트에 있음을 알 수 있습니다.

Py_Initialize/Py_Finalize 번을 두 번 이상 호출합니까? 왜 이런 걸 (I 좀 편의를 위해 C와 파이썬을 혼합하고 있습니다)하지 :

/* startup */ 
Py_Initialize(); 

/* do whatever */ 
while (moreFiles()) { 
    PyRun_SimpleString("execfile('%s')" % nextFile()); 
    /* do whatever */ 
} 

/* shutdown */ 
Py_Finalize(); 

문제는 파이썬 모듈을 작성 대부분의 사람들은 자신의 모듈을 경우 발생하는 걱정하지 않아도됩니다 최종화 및 재 초기화되고, 종종 최종화 동안 정리에 신경 쓰지 않습니다. 모듈 작성자는 프로세스가 종료 될 때 모든 메모리가 해제된다는 것을 알고 있으므로 그 이상으로 신경 쓰지 않아도됩니다.

정말 하나의 버그는 아니지만 실제로는 수천 개의 버그입니다. 각 확장 모듈마다 하나씩 있습니다. 이는 소수의 사용자에게 영향을주는 버그에 대해 엄청난 양의 작업이며, 그 중 대부분은 실행 가능한 해결 방법이 있습니다.

언제든지 Py_Finalize에 대한 호출을 생략하고 Py_Initialize을 호출하면 다시 작업 할 수 있습니다. 즉, 응용 프로그램이 Python 스크립트를 처음 실행할 때 추가 메모리 사용을 사용하고 종료 할 때까지 추가 메모리가 OS로 반환되지 않습니다. 한동안 매번 Python 스크립트를 실행하는 한, 누수로 분류하지는 않습니다. 귀하의 응용 프로그램은 Valgrind - 깨끗한되지 않을 수도 있지만 그것은 체처럼 새는 것보다 낫다.

메모리 누수를 피하기 위해 (순수한) 파이썬 모듈을 언로드해야하는 경우 그렇게 할 수 있습니다. sys.modules에서 삭제하십시오. Py_Finalize

단점 : 당신이 반복적으로 파이썬 스크립트를 실행하는 경우, 그것은 그들 사이 Py_Finalize를 실행하는 많은 이해가되지 않습니다. 다시 초기화 할 때마다 모든 모듈을 다시로드해야합니다. 내 파이썬 부팅시 28 모듈을로드합니다.

추가 설명 : 버그는 파이썬으로 국한되지 않습니다. 어떤 언어로든 상당량의 라이브러리 코드는 라이브러리를 언로드하고 다시로드하려고하면 메모리가 누수됩니다. 많은 라이브러리가 C 코드를 호출합니다. 많은 C 프로그래머는 라이브러리가 한 번로드되고 프로세스가 종료 될 때 언로드한다고 가정합니다.

+0

간단한 솔루션이 없다는 점에 다소 실망 스럽지만 감사합니다. 적어도 현재의 접근 방법을 검증합니다. – user1140116

+0

성취하고자하는 것은 무엇입니까? (종종, * 해결할 수 있습니다.) –

+0

파이썬 스크립트를 반복적으로 실행할 파이썬 IDE를 만들고 있습니다. 스크립트가 실행될 때마다 프로그램에서 사용하는 메모리가 증가합니다. 나는 응용 프로그램 시작시 Py_Initialize를 호출하고 Py_Finalize를 호출하지 않습니다 (boost :: python에 의해 호출 됨). 스크립트에는 PyOpenGL과 PyQt를 포함한 라이브러리가 포함되어 있습니다. 특히 QImage를 사용할 때 메모리가 할당 해제되지 않는 문제가 발생했습니다. – user1140116

관련 문제