巨大なテキストノードを含むxmlデータファイルに遭遇した後、 処理スクリプトでいくつかの方法を読んで評価しました。Perlで巨大なテキストノードを持つxmlを読むための実用的な方法
XMLファイルは アプリケーションがこの構造(例)を有する分子モデリングのための3次元座標ファイルである:
<?xml version="1.0" encoding="UTF-8"?>
<hoomd_xml version="1.4">
<configuration>
<position>
-0.101000 0.011000 -40.000000
-0.077000 0.008000 -40.469000
-0.008000 0.001000 -40.934000
-0.301000 0.033000 -41.157000
0.213000 -0.023000 -41.348000
...
... 300,000 to 500,000 lines may follow >>
...
-0.140000 0.015000 -42.556000
</position>
<next_huge_section_of_the_same_pattern>
...
...
...
</next_huge_section_of_the_same_pattern>
</configuration>
</hoomd_xml>
各XMLファイルは、いくつかの巨大なテキストノードを含み、60メガバイトと100メガバイトの間の大きさはに応じています内容
は、私が最初に XML::Simpleを使用してナイーブapprochを試みたが、ローダは最初にファイル解析するために永遠にかかるだろう:...
my $data = $xml->XMLin('structure_80mb.xml');
...
をし、「内部エラー:巨大な入力検索」で停止するので、このアプローチISN」非常に実用的です。
次のtryは、読書のためXML::LibXMLを使用していた - しかし、ここでは、初期ローダーは、エラーメッセージが表示されてすぐに救い出すだろう「パーサーエラー:xmlSAX2Characters:巨大なテキストノード」。
stackoverflowのにこのトピックへの書き込みBefor、私は自分自身のための水溶液& Dパーサを書き、(スカラー$xml
にXX MBのXMLファイルをズルズルした後に)それを介してファイルを送っ:
...
# read the <position> data from in-memory xml file
my @Coord = xml_parser_hack('position', $xml);
...
、配列として各行のデータを返す秒以内に完了し、次のようになります。
sub xml_parser_hack {
my ($tagname, $xml) = @_;
return() unless $xml =~ /^</;
my @Data =();
my ($p0, $p1) = (undef,undef);
$p0 = $+[0] if $xml =~ /^<$tagname[^>]*>[^\r\n]*[r\n]+/msg; # start tag
$p1 = $-[0] if $xml =~ /^<\/$tagname[^>]*>/msg; # end tag
return() unless defined $p0 && defined $p1;
my @Lines = split /[\r\n]+/, substr $xml, $p0, $p1-$p0;
for my $line (@Lines) {
push @Data, [ split /\s+/, $line ];
}
return @Data;
}
これはもちろん、これまで正常に動作しますが、「生産準備」とみなさすることはできません。
Q:Perlモジュールを使用してファイルを読み取るにはどうすればよいですか?どのモジュールを選択するのですか?事前に
おかげ
RBO
補遺:chorobaさんのコメントを読んだ後、私はXMLに深く見えた::のlibxml。 ファイルmy $reader = XML::LibXML::Reader->new(location =>'structure_80mb.xml');
のオープンは、私が以前考えていたことに反して動作します。私は、タグ下のテキストノードにアクセスしようとすると、エラーが発生します。
...
while ($reader->read) {
# bails out in the loop iteration after accessing the <position> tag,
# if the position's text node is accessed
# -- xmlSAX2Characters: huge text node ---
...
http://search.cpan.org/~mirod/XML-Twig -3.44/Twig.pm - 巨大なXML文書をツリーモードで処理するためのperlモジュール。 –
XML :: LibXMLでファイルをどのように開いたのですか?それは100MBのファイルのために私のために働く。 – choroba
@choroba - ありがとう、もう一度チェックして、トピックを更新しました。 –