Я пытаюсь разобрать большой XML-файл. Я прочитал его с помощью XML :: SAX (используя Expat, а не реализацию perl) и поместил все узлы второго уровня и ниже в свой класс «Node»:
package Node;
use Moose;
has "name" =>
(
isa => "Str",
reader => 'getName'
);
has "text" =>
(
is => "rw",
isa => "Str"
);
has "attrs" =>
(
is => "rw",
isa => "HashRef[Str]"
);
has "subNodes" =>
(
is => "rw",
isa => "ArrayRef[Node]",
default => sub { [] }
);
sub subNode
{
my ($self, $name) = @_;
my $subNodeRef = $self->subNodes;
my @matchingSubnodes = grep { $_->getName eq $name } @$subNodeRef;
if (scalar(@matchingSubnodes) == 1)
{
return $matchingSubnodes[0];
}
return undef;
}
1;
В подпрограмме «end_element» я проверяю, является ли это узлом Я забочусь о нем, и если это так, я провожу дополнительную обработку.
Все это отлично работало с моими тестовыми файлами, но позавчера я бросил его в свой настоящий файл, все 13 миллионов его строк, и это заняло навсегда. Он работает более 36 часов. Как узнать, что является узким местом: Moose или XML :: SAX? Moose всегда такой медленный, или я неправильно его использую?
Обновление Создание профиля для подмножества данных в 20 000 строк показывает, что узким местом является Moose - особенно в Class :: MOP :: Class :: compute_all_applicable_attributes (13. 9%) и другие классы Class и Moose.