• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoaoRodrigues

Parsing de XML sem usar 1GB de RAM

7 mensagens neste tópico

Malta, bom dia :D

Já pus esta dúvida algumas vezes, mas hoje voltei a olhar para o código e voltou-me a surgir este problema.

Tenho um documento de XML que retiro da net periodicamente. Fica aqui o link para um desses documentos:

http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?retmode=xml&datatype=pdat&mindate=2008&maxdate=2008/10/05&retstart=0&retmax=585105

O meu objectivo é retirar os valores que se encontram nas tags <Id></Id>. Como se vê, são 585105 valores para serem retirados :x Tenho usado uma biblioteca chamada libxml2 que tem feito o trabalho impecavelmente bem e de uma forma tão simples que até assusta.

Mas, depender de uma biblioteca externa implica depender de 3os para me fornecerem a biblioteca. E essa menina não é simples de arranjar para Windows. E como é em Windows que o servidor que usa o meu programa corre, preferia usar uma biblioteca que já viesse com o Python para me resolver o assunto. Já dei uma olhadela à DOM (minidom) e correu bem, mas quando pus este link a ser usado... o meu consumo de RAM saltou para o impensável.

Têm alguma sugestão para isto? Ou estou a ser picuinhas demais? :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso está num site .gov, à partida não usarão esse xml para fazer injecção de codigo.

Por isso métodos mais curriqueiros funcionam.

Eu por mim era sacar logo isso à bruta com regex. Se quiseres valida os valores posteriormente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema é que ao usares DOM, tens que carregar uma estrutura com todo o ficheiro XML para memória.

Tenta usar uma biblioteca que use SAX. O ficheiro parece ter uma estrutura bastante simples, por isso não deve ser nada de complicado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu objectivo é retirar os valores que se encontram nas tags <Id></Id>.

Se o objectivo é esse, não precisas de nenhuma biblioteca para o parse de XML, como sugerido pelo pedrotuga.

Aqui fica em Perl e de certeza que funciona em windows (se tiveres o interpretador):

#!/usr/bin/perl
use strict;
use warnings;

my $file_in = q|esearch.fcgi|;
my $file_out = q|esearch_out.txt|;

open my $FILE_OUT,"> $file_out" or die $!;

open my $FILE_IN,"< $file_in" or die $!;
while (<$FILE_IN>) {
     my ($id) = $_ =~/^.*<Id>(\d+)<\/Id>$/gmx;
     next unless $id;
     print $FILE_OUT qq|$id\n|;
}
close $FILE_IN;
close $FILE_OUT;

$ time perl parse_esearch.pl
perl parse_esearch.pl  1,86s user 0,06s system 80% cpu 2,393 total

$ uname -a
Linux lappy 2.6.25.4 #7 SMP Sat May 31 23:47:25 WEST 2008 i686 Intel(R) Pentium(R) 4 CPU 2.66GHz GenuineIntel GNU/Linux

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yep, lembrei-me de usar Regex tb, mas depois há um tipo de ficheiro mais complicado que será mais simples se usar algum tipo de parser XML :) Daí estar a procurar alternativas XML-based :confused:

Rui Carlos, SAX? Vou ver isso :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora