2

私のアプリケーションは、非常に大きな xml ファイル (約 300K トランザクション) を作成します。各トランザクションには、約 20 個の xml 要素があります。そのため、巨大なxmlファイルが作成されます。メモリが制約であるため、xml ファイルの作成には JAXB、SAX、または DOM を使用しませんでした。xml ファイルが作成されたら、特定のタグ値を置き換える必要があります。何を置き換えるか、何を置き換えるかはわかっています。ファイル全体をメモリにロードせずにこれらの変数を置き換えるにはどうすればよいですか? 300K トランザクションの場合、ファイル サイズは約 600 MB になります。そのため、いくつかの変数を置き換えるためにファイル全体をメモリにロードしたくありません。

Java5を使用しています。それを行う方法はありますか?

4

3 に答える 3

2

VTD-XMLを試すことができます:

  • メモリ効率の高い (XML ドキュメントのサイズの 1.3x ~ 1.5x) ランダム アクセス XML パーサー。
  • 最速の XML パーサー: Core2 2.5Ghz デスクトップでは、VTD-XML は DOM パーサーよりも 5 倍 ~ 12 倍優れており、コアあたり 150 ~ 250 MB/秒の持続的なスループットを実現します。
  • 最大効率で XML ドキュメントの切り取り、貼り付け、分割、および組み立てが可能な、増分更新対応の XML パーサー。
  • C、C++、C#、およびJavaで利用できます。

XML の変更例

于 2015-04-30T07:58:28.910 に答える
1

XSLT 3.0 (具体的には、Saxon-EE) を使用してストリーミング変換を試すことができます。

「タグ値」が何を意味するのかわかりませんが (人々が正しい用語を使用すれば非常に簡単です...)、テキスト ノードの値を意味する場合は、次のようなストリーミング変換を記述できます。

<xsl:mode streamable="yes" on-no-match="shallow-copy"/>

<xsl:template match="xyz/text()[.='old value']">
  <xsl:text>new value</xsl:text>
</xsl:template>

追加の置換のための追加のルールがあります。もちろん、選択した要素の名前を変更したり削除したりするルールを設定することもできます。

于 2015-04-30T07:21:29.433 に答える
1

このトピックについてこれまでに読んだことはすべて、ファイルをメモリにロードするか、別のファイルにストリーミングしないと、これを行うことができないことを示しています。それはおそらくあなたがしなければならないことです - あなたのソースを新しいファイルにストリーミングし、あなたが行くにつれて変更します。

そのプロセスに関する詳細情報 - http://docs.oracle.com/javaee/5/tutorial/doc/bnbfl.html#bnbgq

ここでの回答で Stephen C があなたの問題に対処する方法が気に入っています - How to modify a huge XML file by StAX?

于 2015-04-30T04:36:18.750 に答える