8

非常に大きな XML ファイル (100 MB など) をできるだけ速く処理するために、Delphi (私は Delphi 2009 を使用しています) で何を使用すればよいかについての推奨事項が必要です。

XML を入力し、プログラムから XML 内のデータにアクセスして更新し、変更した XML を再度エクスポートする必要があります。

うまくいけば、高速な Windows マシンで数秒以内に入力と出力を行うことができます。


説明。レポートを作成し、データを更新するためにデータ構造にアクセスすることが重要であり、この機能を非常に高速にする必要があるため、DOM を使用する必要があると思います。

入力はファイルのロードに対して 1 回だけ行われ、出力はファイルの保存に対してのみ行われ、通常は終了時に 1 回だけ行われます。これらも高速である必要がありますが、メモリ内データへのアクセスと更新ほど重要ではありません。

私の理解では、サードパーティのパーサーは入力と出力にのみ役立ちますが、メモリに読み込まれたデータの使用と変更には役立ちません。それとも私はこれで間違っていますか?

4

8 に答える 8

7

私があなたの質問を正しく理解した場合、あなたはデータ構造を知っていて、ファイルのXML構造ではなくデータを変更しています。

これらの条件下で、パフォーマンスが重要な場合は、直接テキスト操作を試すことができます-XML解析をスキップします。

ストリームから読み取り、 Boyer-Mooreなどの高速テキスト検索アルゴリズムを使用して、データを変更する必要がある場所を見つけ、変更を行って、データを別のストリームに出力します。

これは、ワンパス、XML解析、メモリ内XMLツリー構築はありません。

于 2008-11-05T08:24:27.147 に答える
5

DOM パーサーの代わりに SAX を検討する価値があります。

DOM を使用すると、ドキュメントをロードするオーバーヘッドが発生しますが、ロードされたデータにはすばやくアクセスして更新できます。

SAX では、begin-element、end-element などのハンドラーを作成する必要がありますが、作業を進めていくうちに、はるかに柔軟に行うことができます。

おそらくあなたの状況には役立たないかもしれませんが、SAX はいつでも構文解析を停止できるため、検索を行う場合に非常に便利です。

プログラムが変更内容を認識する前にすべてのデータを解析する必要がない場合は、データが読み取られたときに更新され、それ以外の場合はデータが渡される SAX ハンドラを作成できます。すべてをあらゆる種類のメモリ構造にロードします。これにより、非常に大きなファイルでメモリの制約に達することがないため、ソリューションが非常にスケーラブルになります。

それだけの価値があるため、私は MSXML DOM および SAX パーサーを使用する傾向があります。それらは最高のパフォーマンスではないと主張することができます.おそらくより多くの人々がそれらの改善に取り組んでいるので、それらはますます良くなると私は主張します.

于 2008-11-05T01:44:42.320 に答える
4

SimDesignのNativeXMLに非常に満足しています。また、FastXMLと呼ばれる特別なバージョンも含まれています。これはまだテストしていませんが、高速であると言われています。

于 2008-11-05T07:14:31.140 に答える
3

The Delphi Inspiration の DIHtmlParser コンポーネントを参照してください。「特に巨大なファイルを解析するときは非常に高速」であり、「最新のマシンでは、スコアは 1 秒あたり 15 MB 以上の HTML データに達する」と考えられています。巨大なファイルで試したことはありませんが、かなり良い経験がありました。

于 2008-11-05T01:36:58.577 に答える
2

私は専門家ではありませんが、SAX パーサーは DOM よりもはるかに効率的であるというのがコンセンサスだと思います...

于 2008-11-05T00:56:08.707 に答える
1

イベント駆動型のSAXの方法を検討している場合は、XMLパーサーライブラリが非常に便利な場合があります。

于 2008-11-06T11:38:04.150 に答える
0

直接操作だけが必要な場合は、zendarによる回答に同意します。

DOMまたはSAXの実装に関しては、DIXmlをお勧めします。

于 2009-05-08T07:11:50.920 に答える
0

私が発見したもう1つの可能性は、購入したLMD ElPackパッケージを使用することです.XMLサポートライブラリが含まれており、「非常に高速で、完全にユニコード対応で、Exeファイルに小さなフットプリントしか追加しません」.

LMD 7 パッケージ (Delphi 2009 用) に含まれる LMDXML.pas ユニットのソースを見ると、コードは Michail Vlasov による SimpleXML リリース 8.0 (2006 年 7 月) コードに基づいていることがわかります。

于 2008-11-07T03:59:47.647 に答える