XML::Twig 在 perl 程序中清除不释放系统内存

XML::Twig purge not releasing system memory in perl program

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

我将整个文件加载到内存中(它占用了大约 3GB(大约可用空间的 50%),这在意料之中)。然后我 added/modified 一些值并使用打印到文件的方法将文件保存到磁盘。一旦这一切都完成了,我执行了一次清除,以为我会取回用于解析文件的内存。然而,情况似乎并非如此,我想知道为什么?我在 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。我知道我可以使用 twig 处理程序来减少内存使用,但想知道为什么在解析整个文件时清除想法似乎不起作用。

基本原因是 Perl 从不释放它使用的内存给系统。

这个purge其实没什么用。你只需要让树枝超出范围,内存就会被释放……以便 Perl 再次使用。因此,如果您解析多个文件,则使用的内存将是最大文件使用的内存量。

purge 在处理程序中使用,因此来自 XML 树的一部分的内存被释放(给 Perl,而不是系统)并重新用于下一部分。所以使用的内存是他一次保存在内存中的最大部分使用的量。