2017-03-28 1 views
-1

많은 패키지를 사용하는 파이썬 응용 프로그램을 사용하고 실행 중에 일부 메모리 누수가 발생하지만 모든 변수를 복사하고 삭제하더라도 누적됩니다.일부 문장에 도달하면 파이썬을 다시 시작 프로그램

그래서 결국 프로그램이 충돌합니다. 그래서 나는 해결책이 메모리가 문제가 될 때 프로그램을 재시작 할 수 있다고 생각한다. 모든 쓰레기를 제거하기 위해 새 세션을 시작한 후에 오래된 프로그램을 죽여야 메모리를 비울 수 있습니다.

기본 코드는 다음과 같을 수 있습니다 :

results = load('results') 
data = load('data') 
results += some_stupid_operation(results,data) 
save('results', results) 
restart_program() # Kill current program and start new instance 

그것은 괜찮이 Ipython에있는 경우.

면책 조항 : 일반적으로 메모리 누수에 대한 해결책이 아님을 알고 있습니다. 작업을 함수에 넣으면 문제가 해결됩니다. 그런 다음 가비지 수집기가 dabadaba가 주석을 달아서 스스로 해결해야하기 때문입니다.

해결 방법 : Rossi Milan Bob. 예제 코드 : 당신은 당신이 $ chmod a+x yourpgm.py 같은 스크립트를 실행하고 $ ./yourpgm.py는 다음 코드를 사용하는 경우 $ python yourpgm.py

os.execv(sys.executable, ['python'] + sys.argv) 

을 다음과 같이 스크립트를 실행하는 경우

#!/usr/bin/env python 
# program testing the solution 
import numpy as np 
import os 
import sys 
if len(sys.argv)==1: 
    sys.argv=[sys.argv[0],'1'] 
else: 
    sys.argv[1]=str(int(sys.argv[1])+1) # increment iteration 
print sys.argv 
a=np.zeros(10**6) # approximate 10 MB 
# Memory does not accumulate over iterations 
# Looking at system monitor 
if int(sys.argv[1])<100: 
    os.execv(sys.executable, ['python'] + sys.argv) 
+1

의 상단에 다음 코드를 추가하여 스크립트를 실행하게 확인을 논리에 함수를 넣고 그 함수에서 빠져 나왔다면, 메모리를 비울만큼 충분해야합니다. – dabadaba

+2

솔루션은 거의 확실하게 "모든 변수를 복사하고 삭제하지"않습니다. –

+0

다 바다 바와 나는 완전히 동의한다. 이것은 nesserary도 바람직하지 않아야하지만 내 프로그램이 충돌합니다. "복사 - 삭제"논리는 "비단뱀 가비지 수집기가 바보 같은 작업에서 일부 데이터를 삭제할 수 없습니다."였습니다. 내가 알지 못하는 링크가 있어야합니다. Copy.deepcopy는 원래의 객체에 대한 모든 링크를 축소합니다. 그래서 삭제 후에는 모든 오래된 객체가 완전히 참조 해제되어야합니다. 당신은 자세를 배제하기 위해 물건을 사용한다는 것을 알고 있습니다. –

답변

0

사용이 코드는 스크립트를 다시 시작합니다 프로그램을 다시 시작하십시오.

os.execv(__file__, sys.argv) 

어느 쪽이든, sys 모듈 가져 잊지 마세요 :

import sys 

당신이 코드

#!/usr/bin/env python 
+0

감사합니다. 그것은 내 문제를 해결했다. 해결책이 질문에 추가되었습니다. –

관련 문제