[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