4

大きな XML ファイル (MediaWiki ダンプ ファイル) にインデックスを付け、ファイルに保存されている個々のレコードへのランダム アクセスにそれらのインデックスを使用する一連のツールがあります。それは非常にうまく機能しますが、ファイルの作成方法が将来変更された場合に脆弱なソリューションである実際の XML パーサーではなく、文字列関数や正規表現を使用して XML を「解析」しています。

一部またはほとんどの XML パーサーには、そのようなことを行う方法がありますか?

(C、Perl、および Python で記述されたツールのバージョンがあります。ファイル全体をある種のデータベースに解析したり、それらをメモリにマッピングしたりすることはできません。)

アップデート

比較のための大まかな統計は次のとおりです。私が使用しているファイルはほとんど毎週公開されており、現在のファイルのサイズは 1,918,212,991 バイトです。インデックス作成ツールの C バージョンは、私のネットブックでは数分かかり、発行される新しい XML ファイルごとに 1 回だけ実行する必要があります。現在のサイズが 30,565,654,976 バイトで、2010 年に 8 回しか更新されていない別の XML ファイルに対して同じツールを使用することはあまりありません。

4

5 に答える 5

1

Python を使用している場合は、lxml を試してください。これは非常に高速で柔軟性があり、正規表現と比較して速度が非常に優れています。妥協することなく、どの言語でも代替手段よりもはるかに高速です。

iterparse を使用して、ウィキペディアの記事をステップ実行します。

これは、ダンプ内の記事へのランダム アクセスを提供しないことに注意してください (これは完全に妥当な要求です!) - しかし、iterparse は高速で使いやすい「前方のみ」のカーソルを提供します...そして lxml は他の手段で fseek されたチャンクを解析するために使用する適切なツール。

私が見つけた最高のドキュメントは次のとおりです。

http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

(PDF版をお試しください)

これは現在、標準の python ディストリビューションの一部です。

于 2011-08-16T04:42:45.113 に答える
1

VTD-XMLは、この問題に対処するための最初の本格的な試みのようです。

世界で最もメモリ効率の高い(XML ドキュメントのサイズの 1.3x ~ 1.5x)ランダム アクセス XML パーサー

(VTD-XML には独自のタグが StackOverflow にあるので、それに関する質問などをたどることができます: )

于 2013-01-02T13:45:52.940 に答える
1

このデータは、XML データベースが提供するものの非常に小さなサブセットを実行する独自のツールを作成するのではなく、exist-DB などの XML データベースに格納する必要があると思います。

于 2011-05-05T14:21:47.797 に答える
0

XML は構造化された形式です。このようなランダムアクセスはあまり意味がありません。どこに行くのかを知っておく必要があります。

正規表現では、文字列全体をメモリにロードする必要もあります。DOM は通常、XML ファイルのサイズの 3 ~ 4 倍のメモリを必要とするため、これは DOM よりも優れています。

これらの場合の典型的な解決策はSAXです。これらのメモリ フットプリントは非常に小さいですが、順方向専用カーソルのようなものです。したがって、ランダムにアクセスするのではなく、必要な場所に到達するためにツリーをトラバースする必要があります。.NET を使用している場合は、XmlTextReader.

XML が頻繁に更新されない場合にも、インデックスは有用です。このようなインデックスの作成にはコストがかかる可能性があるためです。

于 2011-05-05T12:51:46.983 に答える
-1

XPath は文字列/正規表現の「解析」よりもはるかに優れていますが、xpath は最初にメモリ DOM に解析される xml ドキュメントで動作します。ドキュメントが非常に大きい場合、メモリの問題が発生する可能性があります。

于 2011-05-05T12:52:46.037 に答える