Estoy tratando de analizar un gran archivo XML. Lo leí el uso de XML :: SAX (usando expatriados, no la implementación del Perl) y poner todo el segundo nivel y por debajo de los nodos en mi clase "nodo":¿Por qué el código de Moose es tan lento?
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;
En el "end_element" sub, puedo comprobar si este es un nodo que me importa, y si lo es, hago un procesamiento adicional.
Todo funcionó bien en mis archivos de prueba, pero anteayer lo tiré en mi archivo real, los 13 millones de líneas de este, y me está tomando una eternidad. Ha estado funcionando por más de 36 horas. ¿Cómo puedo saber si es Moose o XML :: SAX el cuello de botella? ¿Moose siempre es tan lento o lo estoy usando mal?
actualización Hacer un perfil en un subconjunto 20000 línea de los datos muestra que se trata de alces que es el cuello de botella - específicamente en la clase :: MOP :: :: Clase compute_all_applicable_attributes (13,9%) y otra clase y las clases de los alces.
Moose puede parecer lento, pero no lo enoje ... –
'Class :: MOP :: Class :: compute_all_applicable_attributes' es algo que debe hacerse mucho si no lo hace' __PACKAGE __-> meta -> make_immutable' tus clases como sugerí en mi respuesta. ¿Cómo cambia el perfil si haces eso? – rafl
@Ether, ese fue sobre el costo de la puesta en marcha. El mío es sobre el costo de ejecución, especialmente la creación y destrucción de objetos. –