我在这段代码中遇到了内存泄漏(我认为):
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的新手。
答案 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