[Moscow.pm] Бааальшие XML: потоковый парсинг
Alex Varyanick
q на cono.org.ua
Сб Ноя 12 00:34:14 PST 2011
2011/11/11 Ivan Petrov <i.petro.77.00 на gmail.com>:
>
> имеется огромная XML на несколько сот гиг.
> предствляет из себя по сути большой массив хешей.
>
> нужно выковырять из нее часть информации.
>
> вопрос: есть ли что-то готовое на эту тему?
У нас на работе пользуют:
my $xml_parser = new XML::Parser( Handlers => {
Start => $self->can(
'header_handler' ),
End => $self->can(
'end_handler' ),
Char => $self->can(
'char_handler' ),
Default => $self->can(
'default_handler' ),
} );
Есть ещё XML::LibXML::Reader (пулл парсер), но он совсем простой и
XPath там порезан ;(
100Гб файликов у мну нет, но вот с работы стырил один маленький:
% ls -lah nsn.xml
-rw-r--r-- 1 cono cono 309M 2011-11-12 09:09 nsn.xml
Пример из доки:
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML::Reader;
my $reader = XML::LibXML::Reader->new(
location => 'nsn.xml'
);
while ($reader->read) {
printf "%d %d %s %d\n", map { $reader->$_ } qw/depth nodeType name
isEmptyElement/;
}
тест:
% time ./test.pl > /dev/null
./test.pl > /dev/null 106.14s user 0.14s system 99% cpu 1:46.49 total
память:
cono 5149 98.0 0.0 39224 6444 pts/1 R+ 09:14 0:48
/usr/bin/perl ./test.pl
скрипт на всём протяжении работы парсера статичен по памяти.
--
Varyanick I. Alex
icq: 102 575 440
skype: cono..
q на cono.org.ua
Подробная информация о списке рассылки Moscow-pm