1

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

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

where$lat$lon是纬度和经度。

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

4

3 回答 3

3

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

XML::Simple 在后台使用 XML::Parser,至少在我测试过的系统上,XML::Parser 遭受严重的内存泄漏,这使得它非常不受欢迎。

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

于 2013-04-03T22:00:47.817 回答
3

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

于 2013-04-04T00:04:26.667 回答
1

除了imran的评论,

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

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

您还想参考perl-xml-faq

于 2013-04-04T10:17:34.993 回答