XML :: Twig清除不释放Perl程序中的系统内存

时间:2019-02-11 09:10:05

标签: xml perl xml-twig

我已经在相当小的xml文件上使用XML :: Twig一段时间了,没有任何问题。大约一周前,我需要解析一个更大的xml文件,大约260MB。该文件包含在一个zip归档文件中(260MB是未压缩文件的大小)。

我将整个文件加载到内存中(预计会占用3GB(约占可用空间的50%))。然后,我添加/修改了一些值,并使用“打印到文件”方法将文件保存到磁盘。完成所有这些操作后,我进行了一次清除操作,以为我将获得用于解析文件的内存。但是,情况似乎并非如此,我想知道为什么吗?我是Linux机器上的XML :: Twig版本3.34和perl版本5.10.1。

我的基本代码结构如下:

 my $Sheetx= $zip->contents('file1.xml');
 my $tw11=new XML::Twig();
 my $Sheetx_parse = $tw11->parse($Sheetx);
 my $fh1PB_filename='file2.xml';
 open(my $fh1PB, '>:encoding(UTF-8)', $fh1PB_filename) or die "Could not open file " . $fh1PB_filename .  " $!";
 $tw11->print($fh1PB);
 close($fh1PB);
 $tw11->purge();
 my $member1 = $zip->removeMember('file1.xml');
 my $member1A = $zip->addFile($fh1PB_filename,'file1.xml','8');

非常感谢任何帮助。

P.S。我知道我可以使用树枝处理程序来减少内存使用,但是想知道为什么在解析整个文件时清除想法似乎不起作用。

1 个答案:

答案 0 :(得分:2)

根本原因是Perl从未将其使用的内存释放给系统。

purge实际上是无用的。您只需要让细枝超出范围,内存就会被释放...供Perl再次使用。因此,如果您解析了多个文件,则使用的内存将是最大文件使用的内存。

purge用于处理程序,因此XML树的一部分中的内存被释放(释放到Perl,而不是系统中),并用于下一部分。因此,所使用的内存是一次存储在内存中的大部分。