使用XML :: Parser解析大型XML文件时如何查看进度?

2 xml perl parsing progress

我正在使用以下代码来解析相当大的xml文件(> 50GB):

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 {
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是解析需要很长时间,我想得到某种进度表.

我更喜欢一种不需要首先扫描整个文件只是为了得到总计数的方法 - 所以,例如,输入文件中的当前位置是完美的,因为我可以简单地检查文件的开始总大小,然后进入handle_start()检查当前位置,然后打印出来.

Gra*_*ean 7

您可能正在寻找current_byte解析器对象的方法,该方法在XML :: Parser :: Expat中有记录.

因此,您可以在开始解析之前将文件的大小保存在全局中:

my $file_size = -s $input_file;
Run Code Online (Sandbox Code Playgroud)

然后像这样在处理程序中计算你的进度:

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

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