2

次のコードを使用して、かなり大きな 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() 現在位置を確認し、出力します。

4

1 に答える 1

7

XML :: Parser::Expatcurrent_byteに文書化されているパーサーオブジェクトのメソッドを探している可能性があります。

したがって、解析を開始する前に、ファイルのサイズをグローバルに保存できます。

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);
}
于 2010-07-18T23:11:17.283 に答える