2012-03-30 14 views
1

私はPerlスクリプトを持っており、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 loop'が 'prepare、execute、fetch and return $ url'の前に' DBI :: connect'を呼びます。 – everbox

+6

コードを洗練された例に洗い流す際に、実際にメモリを使用する部分が洗い流されました。 – DavidO

答えて

1

プロファイリングの場合は、explitict exitを設定します。カウンタを作成し、反復回数がこれ以上であればプログラムを終了します。プロファイリングのため

、NYTprofを使用します。

のperl -d:NYTProf script.pl nytprofhtml

しかし、あなたはここでメモリリークを扱っています。

メモリリークを見つけるために、これを読んで:How can I find memory leaks in long-running Perl program?

は、おそらくあなたは解放されることはありません変数を持っています。 Perlは、変数がスコープから外れてもメモリを解放しますが、変数の1つがスコープから外れることはありません。

$ variable = undefを使用してメモリを解放します。

スクリプト全体を移植すると、そのスクリプトにリークがある可能性があります。

について、

関連する問題