【问题标题】:Memory usage of Perl scriptPerl 脚本的内存使用情况
【发布时间】:2012-04-13 19:48:55
【问题描述】:

我有一个 Perl 脚本,使用 DBI 从 MySQL 获取像 http://1.1.1.1/1.jpg 这样的 URL,然后使用 LWP::Simple 下载这个 jpg 文件。这是一个无限循环。

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

简单明了。我想内存使用量会保持在一定范围内。但是这个脚本连续运行一个月后。内存占用7.5G!

我如何分析它?

【问题讨论】:

  • fetch_url_from_mysql 是否每次都打开一个新连接,而不是关闭它?
  • 是的。我在while loop 之前调用DBI::connect,在fetch_url_from_mysql 中是prepare,execute,fetch and return $url
  • 在将代码清洗成一个干净的示例时,您会清洗掉实际使用内存的部分。

标签: perl


【解决方案1】:

对于分析,设置显式退出。创建一个计数器,如果您的迭代等于或大于此值,则退出您的程序。

对于分析,请使用 NYTprof:

perl -d:NYTProf script.pl nytprofhtml

但是您正在处理这里的内存泄漏。

阅读此内容以查找内存泄漏:How can I find memory leaks in long-running Perl program?

很可能你有一个永远不会被释放的变量。如果变量超出范围,Perl 会释放内存,但其中一个变量永远不会超出范围。

使用 $variable=undef 释放内存。

如果您移植整个脚本,我们可能会发现其中的漏洞。

问候,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多