【问题标题】:How to see progress when parsing large XML file with XML::Parser?使用 XML::Parser 解析大型 XML 文件时如何查看进度?
【发布时间】:2011-03-17 16:05:39
【问题描述】:

我正在使用以下代码来解析相当大的 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 {
    ...
}

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

我更喜欢一种不需要首先扫描整个文件来获取总数的方法 - 例如,输入文件中的当前位置将是完美的,因为我可以简单地在开始时检查文件的总大小,然后在 handle_start() 中检查当前位置,并打印出来。

【问题讨论】:

    标签: xml perl parsing progress


    【解决方案1】:

    您可能正在寻找解析器对象的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);
    }
    

    【讨论】:

    • 非常感谢。这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多