我正在使用
XML::Twig解析大型XML文件(60GB)并在OO(Moose)脚本中使用它.我正在使用twig_handlers选项在它们被读入内存时解析元素.但是,我不确定如何处理Element和Twig.
在我使用Moose(和OO)之前,我的脚本看起来如下(和工作):
my $twig = XML::Twig->new( twig_handlers => { $outer_tag => \&_process_tree,} ); $twig->parsefile($input_file); sub _process_tree { my ($fulltwig,$twig) = @_; $twig->cut; $fulltwig->purge; # Do stuff with twig }
现在我就这样做了.
my $twig = XML::Twig->new( twig_handlers => { $self->outer_tag => sub { $self->_process_tree($_); } } ); $twig->parsefile($self->input_file); sub _process_tree { my ($self,$twig) = @_; $twig->cut; # Do stuff with twig # But now the 'full twig' is not purged }
问题是,我现在看到我错过了对thetwig的清除.我认为 – 在第一个,非OO版本 – 清除将有助于节省内存:尽快摆脱fulltwig.但是,当使用OO(并且必须依赖处理程序中的显式sub {})时,我看不出如何清除完整的树枝,因为文档说明了
$_ is also set to the element,so it is easy to write inline handlers
like
para => sub { $_->set_tag( 'p'); }
所以他们谈论你想要处理的元素,而不是fulltwig本身.那么如果没有传递给子程序,怎么能删除呢?
处理程序仍然得到完整的树枝,你只是没有使用它(使用$_代替).
事实证明你仍然可以在树枝上调用清除(我通常称之为“元素”,或文档中的elt):$_->清除将按预期工作,将整个树枝清除到$中的当前元素_;
一个更清洁(恕我直言)的方式是实际获得所有参数并清楚地清除整个树枝:
my $twig = XML::Twig->new( twig_handlers => { $self->outer_tag => sub { $self->_process_tree(@_); # pass _all_ of the arguments } } ); $twig->parsefile($self->input_file); sub _process_tree { my ($self,$full_twig,$twig) = @_; # now you see them! $twig->cut; # Do stuff with twig $full_twig->purge; # now you don't }