Как увидеть прогресс при разборе большого XML-файла с XML :: Parser? - PullRequest
2 голосов
/ 19 июля 2010

Я использую следующий код для анализа довольно большого XML-файла (> 50 ГБ):

use XML::Parser;

my $p = new XML::Parser(
    'Handlers' => {
        'Start' => \&handle_start,
        'End'   => \&handle_end,            
        'Char'  => \&handle_char,
    }
);
$p->parsefile( 'source.xml' );

...

sub handle_start {
    ...
}

Проблема в том, что анализ занимает очень много времени, и я хотел бы получить какой-то индикатор прогресса.

Я бы предпочел, чтобы не требовалось сначала сканировать весь файл только для того, чтобы получить общее количество - так, например, текущая позиция во входном файле была бы идеальной, потому что я мог бы просто проверить при запуске общий размер файла а затем в handle_start () проверьте текущую позицию и напечатайте ее.

1 Ответ

7 голосов
/ 19 июля 2010

Вы, вероятно, ищете метод current_byte объекта анализатора, который задокументирован в XML :: Parser :: Expat .

Таким образом, вы можете сохранить размер файла в глобальном формате перед началом анализа:

my $file_size = -s $input_file;

и затем вычислите ваш прогресс в обработчике следующим образом:

sub handle_start {
    my($parser, $element) = @_;

    my $pos = $parser->current_byte;
    printf("%-20s %5.1f%%\n", $element, $pos * 100 / $file_size);
}
...