使用 XML::Parser 解析大型 XML 文件时如何查看进度?
我正在使用以下代码来解析相当大的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可能正在寻找解析器对象的
current_byte
方法,该方法记录在 XML::Parser::Expat。因此,您可以在开始解析之前将文件的大小保存在全局中:
然后在处理程序中计算进度,如下所示:
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:
and then calculate your progress in the handler like this: