2011-03-01 2 views
8

파이썬 스크립트 하나에 메모리 누수가 있음을 깨달았습니다. 처음에는 약 25MB를 차지했고, 15 일 후에는 500MB 이상이었습니다.파이썬에서 사용 가능한 모든 튜플을 디버거에서 인쇄합니다.

내가 파이썬 안돼서으로 문제의 근본에 들어갈 수없는 여러 가지 방법을 다음과

...

마지막으로, 나는이

objgraph.show_most_common_types(limit=20) 
tuple      37674 
function     9156 
dict      3935 
list      1646 
wrapper_descriptor   1468 
weakref     888 
builtin_function_or_method 874 
classobj     684 
method_descriptor   551 
type      533 
instance     483 
Kind      470 
getset_descriptor   404 
ImmNodeSet     362 
module      342 
IdentitySetMulti   333 
PartRow     331 
member_descriptor   264 
cell      185 
FontEntry     170 

다음 내가 휴식을 설정할 수있어 점을 찍은 후 반복 할 때마다 ...

objgraph.show_growth() 
tuple 37674  +10 

계속하려면 가장 좋은 방법은 무엇입니까? 이 10 튜플이 추가 매번 나에게 몇 가지 단서를 줄 것이다됩니다 무엇을 -

(Pdb) c 
(Pdb) objgraph.show_growth() 
tuple 37684  +10 

나는 모든 튜플, 크로스 체크를 인쇄 같아요? 친절하게 어떻게 할 지 알려주세요 ..

또는이 메모리 누수를 찾을 수있는 다른 방법이 있습니다. Python 2.4.3을 사용하고 있으며 다른 많은 제품 종속성 때문에 - 불행히도 업그레이드 할 수 없거나 업그레이드해서는 안됩니다.

답변

2

똑같은 스크립트가 15 일간 논스톱으로 올바르게 실행되고 있는지 정확히 읽었습니까?

이러한 장기 실행 프로세스의 경우 주기적으로 다시 시작하는 것이 좋으며 모든 메모리 누수를 제거하는 것보다 훨씬 쉽습니다.

업데이트 : 가디베 징되지 않은 새로 추가 된 모든 개체를 인쇄하십시오. this answer을 참조하십시오.

0

내 첫 번째 생각은 스크립트에서 새로운 개체를 생성하여 일종의 전역 목록으로 누적하는 것입니다. 대개 스크립트를 건너 뛰고 가비지 디버깅보다 영구 데이터를 생성하지 않는 것이 더 쉽습니다. objgraph를 사용하는 유틸리티를 사용하면 가비지 객체를 참조 번호로 인쇄 할 수 있다고 생각합니다. 너는 그것을 시도 할 수있다.

+0

매우 거대한 스크립트 (3 개 모듈 이상)이며 파이썬에 처음이므로 전체 스크립트를 살펴본 후에도 찾을 수 없습니다. 여전히 모든 튜플을 인쇄하는 방법을 찾고 있거나 적어도 세계적인 튜플 만 atleast 인쇄하고 있습니다 ...하지만 운은 아직 없습니다! – user379997

관련 문제