Очистка XML :: Twig не освобождает системную память в программе Perl - PullRequest
0 голосов
/ 11 февраля 2019

Я уже некоторое время использую XML :: Twig для довольно небольших XML-файлов без проблем.Около недели назад мне нужно было разобрать намного больший XML-файл, который был около 260 МБ.Файл содержался в zip-архиве (260 МБ - это размер несжатого файла).

Я загрузил весь файл в память (это заняло около 3 ГБ (около 50% от доступного), что и следовало ожидать).Затем я добавил / изменил некоторые значения и сохранил файл на диск, используя метод печати в файл.Как только все это было сделано, я провел чистку, думая, что верну память, использованную для разбора файла.Однако, похоже, это не так, и мне было интересно, почему?Я являюсь XML :: Twig версии 3.34 и perl версии 5.10.1 на компьютере с Linux.

Моя основная структура кода выглядит следующим образом:

 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');

Любая помощь очень ценится.

PS Я знаю, что мог бы использовать обработчики веток, чтобы уменьшить использование памяти, но хотел бы знать, почему идея очистки, кажется, не работает при разборе всего файла.

1 Ответ

0 голосов
/ 11 февраля 2019

Основная причина в том, что Perl никогда не освобождает память, которую он использует в системе.

purge фактически бесполезен.Вы просто должны выпустить веточку из области видимости, и память будет освобождена ... для повторного использования Perl.Поэтому, если вы проанализировали несколько файлов, используемая память будет равна объему, используемому самым большим файлом.

purge используется в обработчиках, поэтому освобождается память из части дерева XML (для Perl,не система) и повторно используется для следующей части.Таким образом, используемая память - это объем, используемый самой большой частью, хранящейся в памяти за один раз.

...