5

XSLT 変換を使用する Java アプリケーションで作業しています。document() 関数を呼び出すたびにドキュメントがキャッシュされるため、java.lang.OutOfMemory 例外 (実際に発生しています) が発生する可能性があります。

http://xml.apache.org/xalan-j/faq.html#faq-N102F9で、私の場合の解決策ではないヒープ メモリ サイズを増やすことが可能であると読みました。また、サポートされていないように見える増分変換を使用しようとしました。

では、document() 関数を使用しているときに jaxp でドキュメントのキャッシュをオフにする可能性はありますか?

4

3 に答える 3

2

user1066037 の回答のように、サクソンに切り替えることができれば幸いです。サクソン語には という拡張子がありsaxon:discard-documentます。PE または EE エディション、または Saxon-B のいずれかで利用できます。ここで「Saxon-B」を検索してください: http://saxon.sourceforge.net/

サクソンのドキュメントから:

saxon:discard-document()

saxon:discard-document($doc as document-node()) ==> document-node()

この関数は、Saxon の内部ドキュメント プールからドキュメントを削除します。ドキュメントは当分の間メモリ内に残りますが、ドキュメント ツリー内のノードへのすべての参照が範囲外になると、Java ガベージ コレクタによってメモリから解放されます。これにはメモリが解放されるという利点がありますが、欠点は、同じ変換中に同じドキュメントが再度読み込まれると、ソース テキストから再解析され、異なるノード識別子が割り当てられることです。この関数は、引数として提供されたドキュメント ノードを返し、select="saxon:discard-document(document('a.xml'))" などの呼び出しで使用できるようにします。

の使用方法の例が必要な場合はsaxon:discard-document、お知らせください。投稿できます。

于 2011-11-25T17:52:51.747 に答える
1

選択肢があれば。

XalanをSaxonと交換するだけで、すべてがはるかに高速になり、メモリ消費を大幅に削減できます。

私の知る限り、最新のリリースで何かが変更されていない限り、Xalanはドキュメントをメモリにロードします。

Saxonにはストリーミングモードがあります:http://www.saxonica.com/documentation/sourcedocs/streaming/streaming-templates.xml

お役に立てば幸いです。

于 2011-11-25T17:26:46.513 に答える
1

あなたが提供したリンクには、カスタム処理命令を使用してキャッシュを無効にする例が含まれています。そこで提案された回避策を試しましたか?

于 2011-06-15T12:49:26.063 に答える