在Perl中找不到内存泄漏问题

时间:2013-04-03 21:01:46

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

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

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;}

这是来自子,其中输入来自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的新手。

3 个答案:

答案 0 :(得分:3)

快速查询“xml :: simple memory leak”,发现了Yahoo :: Search的文档,声称:

  

XML :: Simple使用XML :: Parser,至少在   系统我测试过它,XML :: Parser遭受了严重的记忆   泄漏使得非常不受欢迎。

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

答案 1 :(得分:3)

XML::Simple解析大文件非常无效(对我而言,它为100Mb文件吃了 3Gb内存)。尝试use XML::Twig获取您的数据。

答案 2 :(得分:1)

imran的评论外,

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

查看来自许多人的答案并从网上阅读,XML::LibXML看起来是首选模块,而对于大型文件则更具体XML::LibXML::Reader。他们中的许多人都不建议使用XML::Simple,并说XML::Simple适用于小文件,并且在涉及大型xml文件时存在问题。 XML::Twig更好(从它的文档),但即使这也有内存泄漏问题。 (参考XML::Twig faq

您还想提及perl-xml-faq