在Perl中查找内存泄漏时遇到问题

在Perl中查找内存泄漏时遇到问题,perl,memory-leaks,xml-parsing,strawberry-perl,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{

我觉得这段代码中有内存泄漏:

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;}
这是一个子系统,输入来自子系统。具体地说,输入是(如果重要的话)

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


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

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

Simple在引擎盖下使用XML::Parser,至少在 在我测试过的系统中,XML::Parser的内存严重不足 这使得它非常不受欢迎


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

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

Simple在引擎盖下使用XML::Parser,至少在 在我测试过的系统中,XML::Parser的内存严重不足 这使得它非常不受欢迎


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

XML::Simple
在解析大型文件时非常无效(对我来说,100Mb文件占用3Gb内存)。尝试对数据使用XML::Twig。

XML::Simple
在解析大型文件时非常无效(对我来说,100Mb文件占用3Gb内存)。尝试使用XML::Twig作为您的数据。

除了用户的评论

有这么多XMLCPAN模块,很难决定应该使用哪一个

从许多人的答案和网络阅读来看,这是一个首选模块,更适合大文件。他们中的许多人都不推荐使用
XML::Simple
,他们说
XML::Simple
适合小文件,但在处理大XML文件时会出现问题<代码>XML::Twig更好(从它的文档中),但即使这样也存在内存泄漏问题。(请参阅)

除了您的评论,您还想参考

有这么多XMLCPAN模块,很难决定应该使用哪一个

从许多人的答案和网络阅读来看,这是一个首选模块,更适合大文件。他们中的许多人都不推荐使用
XML::Simple
,他们说
XML::Simple
适合小文件,但在处理大XML文件时会出现问题<代码>XML::Twig更好(从它的文档中),但即使这样也存在内存泄漏问题。(请参阅)


您还想引用

如果您没有对要保持只读的数据进行更改,请不要复制它,例如,只需说
@windvalue=@{$init{parameters}->{wind-speed'}->{value}
@imran我做了这些更改,看起来可能有点帮助,但关于XML::Simple存在问题的其他答案似乎是正确的。您使用的Perl版本是什么?@Drt我运行的是草莓Perl 5.16。2@DeanMacGregor我建议使用XML::LibXML::Reader模块要保持只读,不要复制它,例如,只需说
@windvalue=@{$init{parameters}->{wind-speed'}->{value}
@imran我做了这些更改,看起来可能有点帮助,但关于XML::Simple存在问题的其他答案似乎是正确的。您使用的Perl版本是什么?@Drt我运行的是草莓Perl 5.16。2@DeanMacGregor我建议使用XML::LibXML::Reader模块,我相信这两者都是因为我执行了imran的建议有点帮助,我只是发现每次我传递XMLin命令时,我的RAM使用量都在增加。这就是你提到的问题吗?我希望不是10年前的事。我相信这两个原因都是因为我执行了imran的建议,这对我有一点帮助。我只是发现,每次我跳过XMLin命令时,我的RAM使用率都在上升。这就是你提到的问题吗?我希望它不会有10年的历史。
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";