4

次のコードのようにXMLデータを読み取ると、メモリ内にDOMツリーが作成されますか?

my $xml = new XML::Simple;

my $data = $xml->XMLin($blast_output,ForceArray => 1);

大きなXMLファイルの場合、ハンドラーなどを使用してSAXパーサーを使用する必要がありますか?

4

3 に答える 3

14

大きなXMLファイルの場合、ドキュメントがメモリに収まる場合はDOMモードでXML :: LibXMLを使用するか、プルモード(XML :: LibXML :: Readerを参照)またはXML :: Twig(私が書いたので)を使用できます。私は偏見がありますが、メモリに収まらないほど大きいファイルに対しては一般的にうまく機能します)。

私はSAXのファンではありません。SAXは使いにくく、実際にはかなり遅いです。

于 2009-12-03T10:58:11.410 に答える
4

以前にXML::Simpleモジュールを使用したことはありませんが、ドキュメントから、メモリ内に単純なハッシュを作成しているように見えます。これは完全なDOMツリーではありませんが、要件には十分な場合があります。

大きなXMLファイルの場合、SAXパーサーを使用すると、より高速でメモリフットプリントが小さくなりますが、それでもニーズによって異なります。データをシリアルに処理する必要がある場合は、XML::SAXを使用するとおそらくニーズに合うでしょう。ツリー全体を操作する必要がある場合は、XML::LibXMLのようなものを使用する方がよいでしょう。

私が恐れているコースのすべての馬です

于 2009-12-03T09:36:47.520 に答える
4

私は両方にイエスと言うでしょう。XML :: Simpleライブラリは、ツリー全体をメモリ内に作成し、ファイルのサイズの大きな倍数になります。多くのアプリケーションでは、XMLが100MB程度を超える場合、perlのメモリに完全にロードすることは事実上不可能です。SAXパーサーは、ファイルが読み取られ、タグが開かれたり閉じられたりするときに「イベント」または通知を取得する方法です。

使用パターンに応じて、SAXまたはDOMベースのパーサーのいずれかが高速になる可能性があります。たとえば、大きなファイルで少数のノードまたはすべてのノードを処理しようとしている場合は、SAXモードがおそらく最適です。たとえば、大きなRSSフィードを読み取り、その中のすべてのアイテムを解析しようとします。

一方、ファイルの一部を別の部分と相互参照する必要がある場合は、DOMパーサーまたはXPathを介したアクセスの方が理にかなっています。つまり、SAXパーサーが必要とする「裏返し」の方法でファイルを記述します。不器用でトリッキーです。

SAXパーサーを少なくとも1回は試すことをお勧めします。これは、そうするために必要なイベント駆動型の考え方が良い練習になるためです。

私はXML::SAX :: MachinesでperlでSAX解析を設定することに成功しました。複数のフィルターとパイプラインが必要な場合は、簡単に設定できます。より単純なセットアップ(つまり、99%の時間)では、単一のsaxフィルター(XML :: Filter :: Baseを参照)が必要であり、XML :: SAX :: Machinesにファイルを解析する(またはファイルハンドルから読み取る)ように指示します。あなたのフィルター。ここに徹底的な記事があります。

于 2010-01-17T02:26:45.150 に答える