19

(以下はすべてJavaで記述されます)

潜在的に非常に大きいXMLドキュメントを入力として受け取るアプリケーションを構築する必要があります。ドキュメントは暗号化されます(XMLsecではなく、クライアントの既存の暗号化アルゴリズムを使用して)、次の3つのフェーズで処理されます。

まず、前述のアルゴリズムに従ってストリームが復号化されます。

次に、拡張クラス(私が提供しているAPIに対してサードパーティによって作成されたもの)は、ファイルの一部を読み取ります。読み取られる量は予測できません。特に、ファイルのヘッダーに含まれることが保証されているわけではありませんが、XMLの任意の時点で発生する可能性があります。

最後に、別の拡張クラス(同じ取引)が入力XMLを1..nサブセットドキュメントに分割します。これらは、2番目の操作で処理されるドキュメントの部分と一部重複する可能性があります。つまり、このオブジェクトを処理するために使用しているメカニズムを巻き戻す必要があると思います。

これが私の質問です:

データ全体を一度にメモリに読み込まずにこれを行う方法はありますか?明らかに、入力ストリームフィルターとして復号化を実装できますが、私が説明している方法でXMLを解析できるかどうかはわかりません。2番目のステップの情報を収集するために必要なドキュメントの多くをウォークオーバーし、次にドキュメントを巻き戻して再度渡すことでジョブに分割します。理想的には、後で使用されなくなったドキュメントのすべての部分を解放します。それらは渡されました。

4

6 に答える 6

12

Staxは正しい方法です。Woodstoxを見ることをお勧めします

于 2008-12-10T13:41:26.440 に答える
7

これは StAX ( JSR 173 ) の仕事のように思えます。StAX はプル パーサーです。つまり、多かれ少なかれ SAX のようなイベント ベースのパーサーのように機能しますが、読み取りを停止するタイミング、プルする要素などをより詳細に制御できます。

このソリューションの使いやすさは、実装を制御できるかどうかなど、拡張クラスが実際に何をしているかに大きく依存します...

重要な点は、ドキュメントが非常に大きい場合、おそらくツリー ベースではなくイベント ベースのパーサーを使用することで、大量のメモリを使用しないということです。

StAX の実装は、SUN ( SJSXP )、Codehaus、または他のいくつかのプロバイダーから見つけることができます。

于 2008-12-10T13:24:46.333 に答える
3

InputStreamファイル内のバイトを復号化するカスタム実装を作成し、SAXを使用して、結果の XML がストリームから取得されるときに解析します。

SAXParserFactory.newInstance().newSAXParser().parse(
  new DecryptingInputStream(), 
  new MyHandler()
);
于 2008-12-10T13:57:56.580 に答える
3

BufferedInputStream非常に大きなバッファ サイズで を使用mark()し、拡張クラスが機能する前とreset()後で使用できます。

拡張クラスが必要とする部分がファイルのかなり奥にある場合、これは非常にメモリを集中的に使用する可能性があります。

より一般的な解決策はBufferedInputStream、バッファリングされるデータが事前設定されたしきい値を超えた場合にディスクにバッファリングする独自の -workalike を作成することです。

于 2008-12-10T12:59:38.193 に答える
1

XOMに興味があるかもしれません:

XOM は、デュアル ストリーミング/ツリー ベースの API であるという点で非常にユニークです。ドキュメントがまだ構築されている間に、ツリー内の個々のノードを処理できます。これにより、XOM プログラムは、基礎となるパーサーがデータを提供できるのとほぼ同じ速さで動作できるようになります。作業を開始する前に、ドキュメントが完全に解析されるのを待つ必要はありません。

XOM はメモリー効率が非常に高いです。文書全体をメモリーに読み込む場合、XOM は可能な限り少ないメモリーを使用します。さらに重要なことは、XOM を使用すると、文書を作成するときに文書をフィルターに掛けることができるため、ツリーの不要な部分を作成する必要がなくなります。たとえば、境界の空白のみを表すテキスト ノードの作成をスキップできます。そのような空白がアプリケーションで重要でない場合。ドキュメントを 1 つずつ処理し、使い終わったら 1 つずつ捨てることもできます。XOM は、サイズがギガバイトのドキュメントを処理するために使用されてきました。

于 2008-12-10T13:21:53.907 に答える
0

XOMライブラリーを見てください。探している例はStreamingExampleExtractor.java、ソース配布のサンプル ディレクトリにあります。これは、特定のノードのみを構築し、それらを処理して破棄する、大きな xml ドキュメントのストリーミング解析を実行する手法を示しています。これは sax アプローチに非常に似ていますが、より多くの解析機能が組み込まれているため、ストリーミング解析を非常に簡単に実現できます。

より高いレベルで作業したい場合は、NUXを見てください。これにより、xpath の評価に必要な量のデータのみをメモリに読み込む高レベルのストリーミング xpath API が提供されます。

于 2011-03-10T21:16:24.267 に答える