如何在Perl中释放内存?

时间:2015-10-11 10:07:39

标签: perl garbage-collection

我编写了用于处理xml文件的Perl代码,并根据此xml文件的记录创建数组。当阵列很大时,我得到了内存不足的情况。我错过它或使用'加入'在它上面。

有什么方法可以在Perl上释放内存?

I get **$data** to the function:

my @records = ();
($records_section) = $data =~ /<gift-doc_body>(.+)<\/gift-doc_body>/ms;

(@records) = $records_section =~ /<gift-doc_document>(.+?)<\/gift-doc_document>/msg;

$new_xml = join("\n", "<root>", @records, "</root>");

我得到了“记忆力不足”。在进行“加入”

时出错

2 个答案:

答案 0 :(得分:5)

Perl自己做垃圾收集。您不必担心释放内存 - 它会在您停止程序执行时自动执行。

你'释放'的方式是停止引用它。因此,如果你尽可能地保持范围,你就不会浪费内存。

然而,XML有点特殊 - XML的问题在于:a)其内存占用量大约是文件大小的10倍; b) 有匹配的标签,这意味着你可能最终必须解析整个文件以确保标记匹配。

这可能是您遇到的问题 - 一个大型XML文件。要处理大型XML文件,您无法真正阅读整个内容 - 您需要确保它有效。

但是,一旦解析库 - XML::Twig允许您使用处理程序来解析文件的子集。你应该考虑这样做。看看purge将会释放内存:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

sub process_some_element {
    my ( $twig, $some_element ) = @_;
    $some_element->print;
    $twig->purge;
}

my $twig =
    XML::Twig->new(
    twig_handlers => 
        { 'some_element' => \&process_some_element } );
$twig->parsefile('sample.xml');

这里的重要部分是purge - 因为它丢弃了迄今为止看到的XML。您也可以使用flush做同样的事情,但打印“看到的”XML,例如 - 如果 - 您想要修改和保留文档结构。

答案 1 :(得分:4)

首先 - Perl没有“释放”内存 - 它有GC。 其次,当你读到记忆时,最好不要全部阅读(如Nitek所述)。 我建议您使用XML :: Twig或XML :: XPath来读取和解析文件,因为它为您处理“大”数据处理(以块为单位)。