Существует ли эквивалент метода dispose
из XML::DOM
в XML :: LibXML?Есть ли эквивалент XML :: DOM :: Node :: dispose в XML :: LibXML?
Мне нужно разобрать много файлов XML, и я не хочу иметь проблемы с памятью.
Существует ли эквивалент метода dispose
из XML::DOM
в XML :: LibXML?Есть ли эквивалент XML :: DOM :: Node :: dispose в XML :: LibXML?
Мне нужно разобрать много файлов XML, и я не хочу иметь проблемы с памятью.
Я не могу говорить для XML::LibXML
, но XML::Twig
определенно имеет метод purge
. Это полезно для больших XML-документов, поэтому вы можете отбросить «обработанные» данные, которые вы уже обработали.
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
sub print_and_purge {
my ($twig, $element) = @_;
##do something with this element
print "-----\n";
$element -> print;
print "-----\n";
$twig -> purge;
}
my $twig = XML::Twig -> new ('twig_handlers' => { 'element' => \&print_and_purge },
'pretty_print' => 'indented');
$twig -> parse (\*DATA);
__DATA__
<root>
<element>fish</element>
<element>
<subelement>content</subelement>
</element>
<element/>
</root>
Примечание - это наглядный пример - это не особенно полезная вещь, чтобы сделать, потому что вы печатаете «элементы» и отбрасывание «корня». Но это более полезно, если вы извлекаете информацию из своего XML.
Также интерес представляет flush
метод, который, вероятно, более актуально, если вы делаете выше:
Очищает прутик до (включительно) текущего элемента, затем удаляет все ненужные элементы из дерево, которое хранится в памяти. flush отслеживает, какие элементы должны быть открытыми/закрытыми, поэтому, если вы скрылись от обработчиков, вам не нужно ни о чем беспокоиться. Просто продолжайте промывать веточку каждый раз, когда вы закончите с поддеревом, и оно получится хорошо сформированным. После того, как весь синтаксический анализ не забудьте снова очистить документ, чтобы распечатать конец документа. Также печатаются декларации doctype и entity.
Не существует механизма для явного освобождения памяти, поскольку это происходит автоматически как можно скорее. Ресурсы автоматически освобождаются, так как ссылки на них отчисляются. Используйте правильные переменные, и все будет в порядке.
Если вы действительно хотите обрезать дерево документа (хотя я не понимаю, почему), вы можете использовать следующие для удаления узла из дерева:
$node->parentNode->removeChild($node);
Узел (и его дети) будут освобождены, когда последняя ссылка на него исчезнет. Обычно это происходит, как только $node
выходит за рамки.
Вы можете просто позвонить $node->unbindNode
и удалить все ссылки на узел и любые его дочерние элементы, дочерние атрибуты и т. Д.. Затем будет уничтожен внутренний xmlNode
.
Не должно быть необходимости явно удалять ваш XML-документ. Ты это пробовал? Нет смысла фиксировать мнимые проблемы – Borodin