2012-03-30 4 views
1

DBI를 사용하여 MySQL에서 http://1.1.1.1/1.jpg과 같은 URL을 가져오고 LWP :: Simple을 사용하여이 jpg 파일을 다운로드합니다. 그것은 무한 루프입니다.Perl 스크립트의 메모리 사용

while (1) { 
    my $url=&fetch_url_from_mysql; 
    if ($url){   
     &download_jpg($url); 
    } else { 
     sleep 1; 
    } 
} 

일반 간단합니다. 나는 메모리 사용량이 어느 정도 유지 될 것이라고 생각한다. 그러나이 스크립트의 1 달 연속 실행 후. 메모리 사용량은 7.5G입니다!

어떻게 프로파일 링 할 수 있습니까?

+0

fetch_url_from_mysql은 매번 새 연결을 열어 닫지 않습니까? – xxpor

+0

예. 'fetch_url_from_mysql'의 while 루프는'prepare, execute, fetch and return $ url'입니다. – everbox

+6

코드를 깨끗한 예제로 씻어 내면 실제로 메모리를 사용하는 부분이 없어집니다. – DavidO

답변

1

프로파일 링을 위해 explitict exit를 설정하십시오. 반복 횟수가 이보다 더 크거나 같으면 카운터를 만들고 프로그램을 종료하십시오.

프로파일 링

는 NYTprof 사용

펄 -d : NYTProf script.pl nytprofhtml

하지만 여기에 메모리 누수 다루고있다.

메모리 누수를 찾으려면이 읽기 : How can I find memory leaks in long-running Perl program?

대부분의 아마 당신은 해제되지 않습니다 변수가 있습니다. Perl은 변수가 범위를 벗어나면 변수를 해제하지만 변수 중 하나는 범위를 벗어나지 않습니다.

$ variable = undef를 사용하여 메모리를 확보하십시오.

전체 스크립트를 이식하면 누수가있을 수 있습니다.

안부,

관련 문제