【问题标题】:Having trouble locating memory leak in Perl在 Perl 中定位内存泄漏时遇到问题
【发布时间】:2013-03-25 18:01:33
【问题描述】:

我在这段代码的 sn-p 中遇到了内存泄漏(我认为):

if (ref($init{'time-layout'}) eq 'HASH') {
    my %time= % {$init{'time-layout'}};
    my @times= @ {$time{'start-valid-time'}};
    if (ref($init{parameters}) eq 'HASH') {
        %param= % {$init{parameters}};
        if (ref($param{'wind-speed'}) eq 'HASH') {
            %wind= % {$param{'wind-speed'}};
            @windvalue= @ {$wind{value}};
            %temp= % {$param{'temperature'}};
            @tempvalue = @ {$temp{value}};
            %wdir= % {$param{'direction'}};
            @wdirvalue = @ {$wdir{value}};
            %hum= % {$param{'humidity'}};
            @humvalue = @ {$hum{value}};
        undef %wind;
        undef %temp;
        undef %wdir;
        undef %hum;}
    undef %param;}

这是来自一个 sub,输入来自XMLin()(来自XML::Simple)。具体来说,输入是(如果重要的话)

http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?    lat=$lat&lon=$lon&product=time-series&begin=2004-01-01T00:00:00&end=2013-04-20T00:00:00&temp=temp&wspd=wspd&rh=rh&wdir=wdir";

其中$lat$lon 是纬度和经度。

代码需要几个小时才能运行将数据插入 SQL 服务器,而且在完成之前,Perl 实例占用了数 GB 或更多的 RAM。我确信这对某人来说很简单,但我充其量只是 Perl 的新手。

【问题讨论】:

  • 如果您没有对想要保持只读的数据进行更改,请不要复制它,例如就说@windvalue = @{$init{parameters}->{'wind-speed'}->{value}}
  • @imran 我进行了这些更改,它可能看起来有点帮助,但关于 XML::Simple 的其他答案似乎是正确的。
  • 您使用的 Perl 版本是什么?
  • @Drt 我正在运行 Strawberry Perl 5.16.2
  • @DeanMacGregor 我建议使用 XML::LibXML::Reader 模块。

标签: perl memory-leaks xml-parsing strawberry-perl


【解决方案1】:

除了imran的评论,

有这么多的 XML cpan 模块,很难决定应该使用哪一个。

查看许多人的答案并从网络上阅读,XML::LibXML 看起来是一个首选模块,而XML::LibXML::Reader 对于大文件更具体。他们中的许多人不推荐使用XML::Simple,并说XML::Simple 适用于小文件,但在处理大型xml 文件时会出现问题。 XML::Twig 更好(来自它的文档),但即使这样也存在内存泄漏问题。 (参考XML::Twig faq

你也想推荐perl-xml-faq

【讨论】:

    【解决方案2】:

    XML::Simple解析大文件方面非常无效(对我来说,它占用了 100Mb 文件的 3Gb 内存)。尝试use XML::Twig 获取您的数据。

    【讨论】:

      【解决方案3】:

      快速的duckduckgo搜索“xml::simple memory leak”找到了Yahoo::Search的文档,该文档声称:

      XML::Simple 在底层使用 XML::Parser,至少在 在我测试过的系统中,XML::Parser 内存不足 泄漏使其非常不受欢迎。

      看起来可能(甚至可能)内存泄漏可能根本不在您的代码中。

      【讨论】:

      • 我相信这都是因为我执行了 imran 的建议,这有点帮助,而且我只是发现每次通过我的 XMLin 命令时我的 RAM 使用率都在上升。这是您所指的问题吗? perlmonks.org/index.pl?node_id=251630我希望它不是 10 岁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多