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

发布于 2024-09-11 01:15:11 字数 485 浏览 2 评论 0原文

我正在使用以下代码来解析相当大的 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() 检查当前位置并打印它。

I'm using following code to parse rather large xml file (> 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 {
    ...
}

The problem is that it takes very long to parse, and I'd like to get some kind of progress meter.

I'd prefer a way that doesn't require first scanning whole file just to get total count - so, for example, current position in input file would be perfect, because I could simply check at start total size of file, and then in handle_start() check current position, and print it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丢了幸福的猪 2024-09-18 01:15:11

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

You're probably looking for the current_byte method of the parser object, which is documented in XML::Parser::Expat.

So you could save the size of the file in a global before starting the parse:

my $file_size = -s $input_file;

and then calculate your progress in the handler like this:

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

    my $pos = $parser->current_byte;
    printf("%-20s %5.1f%%\n", $element, $pos * 100 / $file_size);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文