0

私たちのプログラムは現在、libxml2 DOM API(xmlReadFile)を使用してファイル全体をメモリにロードしています。残念ながら、 libxml2 DOMの基本的なメモリ消費量は基本ファイルサイズの約4〜5倍であるため、これは「大きな」XMLファイルに分類されます。

ツリー全体をメモリに保存したくない場合、libxml2はXMLを読み取るための2つのAPI、 SAX2とxmlReaderを提供しているようです。

私はまだAPIを掘り下げていませんが、どのような状況でどちらが好ましいのか疑問に思っていますか?

注:XMLファイルで行う必要があるのは、一部のC++データ構造にXMLファイルで見つかったデータを入力することだけです。そして、これらは(非常に冗長な)XML定義よりもはるかに小さくなります。現時点ではxmlReadFile、DOM APIを使用すると、プロセスは20MBのXMLファイルに対して約100MBのメモリを使用します。このようなファイルのメモリ内のC++データは5MBに近いので、1:4から4:1に変更できます。これは、すでに大いに役立ちます。

4

2 に答える 2

1

私はこのアプローチに従います。処理がまばらな場合(あちこちに要素のみが必要)、xmlReaderの方が優れています。すべての要素を処理する必要がある場合は、SAXの方が優れています。ただし、処理をプッシュするか、処理にコードをプッシュするかについて意見が出てくる可能性があります...

于 2013-03-21T15:07:13.550 に答える
1
  • 大きなXMLドキュメントを処理する必要がある場合は、サイズが主な考慮事項になります。DOM解析で20MB->100MBで見たように、これよりもはるかに大きくなると、非常に高額になる可能性があり、SAXがそれを処理する唯一の方法である可能性があります。組み込みまたはメモリに制約のあるデバイスの場合、小さなファイルでもSAXが必要になることがあります。

  • ファイルが完成する前に解析を開始したい場合は、SAXが最適です。ブラウザを作成している場合、XMLをストリーミングしている場合、または応答性が必要な場合は、SAXを使用する必要があります。

  • SAXはもっと面倒です。通常、コードが少なくなり、コードが単純になるDOM解析を回避できれば、DOMクエリが単純になると、たとえばステートマシンを回避できます。ドキュメント内のほんの一握りのフィールドだけを気にする場合は、DOMパーサーに直接クエリを実行することを避け、代わりにXSLTにクエリを実行することもできます。

于 2017-09-14T07:24:52.580 に答える