我编写了用于处理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>");
我得到了“记忆力不足”。在进行“加入”
时出错答案 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来读取和解析文件,因为它为您处理“大”数据处理(以块为单位)。