私はXML::Twig
を使用して非常に大きなXML文書を解析しています。私は<change></change>
タグに基づいてそれをチャンクに分割したいと思います。XML :: Twigを高速化するには
今私が持っている:それはXMLからそのブロックを引っ張ると
my $xml = XML::Twig->new(twig_handlers => { 'change' => \&parseChange, });
$xml->parsefile($LOGFILE);
sub parseChange {
my ($xml, $change) = @_;
my $message = $change->first_child('message');
my @lines = $message->children_text('line');
foreach (@lines) {
if ($_ =~ /[^a-zA-Z0-9](?i)bug(?-i)[^a-zA-Z0-9]/) {
print outputData "$_\n";
}
}
outputData->flush();
$change->purge;
}
は今のところ、これはparseChange
メソッドを実行しています。非常に遅いです。私は、$/=</change>
というファイルからXMLを読み込み、XMLタグの内容を返す関数を書くことに対してそれをテストしました。
何かがありませんか?XML::Twig
を間違って使用していますか?私はPerlの初心者です。
EDIT:変更ファイルからの変更例です。ファイルは、他の後に、これらの1つの右の多くで構成され、それらの間に何があってはならない。
<change>
<project>device_common</project>
<commit_hash>523e077fb8fe899680c33539155d935e0624e40a</commit_hash>
<tree_hash>598e7a1bd070f33b1f1f8c926047edde055094cf</tree_hash>
<parent_hashes>71b1f9be815b72f925e66e866cb7afe9c5cd3239</parent_hashes>
<author_name>Jean-Baptiste Queru</author_name>
<author_e-mail>[email protected]</author_e-mail>
<author_date>Fri Apr 22 08:32:04 2011 -0700</author_date>
<commiter_name>Jean-Baptiste Queru</commiter_name>
<commiter_email>[email protected]</commiter_email>
<committer_date>Fri Apr 22 08:32:04 2011 -0700</committer_date>
<subject>chmod the output scripts</subject>
<message>
<line>Change-Id: Iae22c67066ba4160071aa2b30a5a1052b00a9d7f</line>
</message>
<target>
<line>generate-blob-scripts.sh</line>
</target>
</change>
XMLを正規表現で前処理してから、 'XML :: Twig'に渡すことをお勧めします。これにより、コードのロバスト性が大幅に低下します。たとえば、コメント内に「」がある場合はどうなりますか?また、XML構文解析がスクリプトを遅くすることであるとは考えにくいです。より多くの情報を提供できますか:ファイルのサイズと処理の種類は? – dan1111
私はどこでも正規表現を使っていません。 1つの方法は小枝を使用し、もう1つはそれを読み込み、それを自分で解析していました。私は全体のスクリプトからこの部分を抜き出したので、実行中の唯一のものです。 また、ファイルサイズは2.3GBです。私はxmlからデータを抽出し、その一部をハッシュに追加しています。 – user1897691
申し訳ありませんが、「正規表現」と言うのは間違いです。私はあなたがそれを解析する前にいくつかの規則(行区切り記号など)を使用してファイルを分割すると、XMLの完全性を破る可能性があることを意味しました。あなたのXMLファイルの大きさはどれくらいですか? – dan1111