2012-01-30 6 views
4

私のプロジェクトには、XML形式でデータベースからデータを収集し、XSLTを実行してユーザーが希望するレポート形式を生成するレポートモジュールがあります。この時点でのオプションはHTMLとCSVです。Xalan XSLT - メモリ不足ヒープスペース

私たちはJavaとXalanを使用して、データとのやりとりをすべて行います。

悪い点は、ユーザーが要求できるこれらのレポートの1つが、XML部分だけで143MB(約430,000レコード)であることです。これをHTMLに変換すると、ヒープスペースがなくなり、ヒープ用に最大4096Gが確保されます。これは受け入れがたい。

問題は単にデータが多すぎるようですが、顧客を制限し、機能要件を満たすことができない場合よりも、これに対処するより良い方法があると考えることはできません。

私は必要に応じてより多くの情報を提供してうれしいですが、私はあなたが大部分を理解していると確信しているので、私はプロジェクトについてあまり詳しく説明することはできません。また、答えはイエスです。私は同時にすべてのデータを必要とします:私はそれを改ページすることはできません。私が使用しています

おかげ

EDIT

すべての変換クラスが持つjavax.xml.transformパッケージに含まれています。実装は次のようになります。

final Transformer transformer = 
    TransformerFactory.newInstance().newTransformer(
    new StreamSource(new StringReader(xsl))); 
final StringWriter outWriter = new StringWriter(); 
transformer.transform(
    new StreamSource(new StringReader(xml)), new StreamResult(outWriter)); 
return outWriter.toString(); 

可能であれば、私はXSLTをそのままにしておきたいと思います。 StreamSourceの処理方法では、処理されるデータの一部をGCに渡す必要がありますが、XSLT(関数など)の制限が適切なクリーンアップを行うために必要なことがわかりません。誰かが私にこれらの制限を詳述するリソースを教えてもらえると、非常に役に立ちます。

答えて

1

これを改善するには、2つの方法があります。

  1. XMLの送信元と送信先の形式をとり、一時的にファイルにします。これにより、データがデータベースから取得され、DBに書き戻されるため、最初の作成と格納がRAMから削除されます。データへのハンドルはすべて必要です。

  2. Saxonicaトランスを使用してください。これにより、SAX形式の変換やXalanパーサにはないXSLT 2.0の使用など、いくつかのことが可能になります。

2

XSLTの問題は、変換中にメモリ内にソースドキュメント全体(および結果ドキュメント)のDOM表現が必要であることです。大規模なXMLファイルの場合、これは深刻な問題です。

ストリーミング変換が可能なシステムに興味があります。完全なドキュメントをメモリに格納する必要はありません。おそらくSTXはオプションです: http://www.xml.com/pub/a/2003/02/26/stx.html http://stx.sourceforge.net/です。これはXSLTと非常によく似ています。したがって、XSLTスタイルシートをXMLに直接適用すると、STXに書き直すのは簡単です。

+0

さらに、XSLTの最新バージョンには、ストリーミング機能が含まれています。http://www.w3.org/TR/xslt-21/#streaming-concepts。私はそれを自分で試していない。 –

+0

サクソンも[ストリーミング]をサポートしています(http://saxonica.blogharbor.com/blog/_archives/2006/7/4/2084120。html)、あなたがこのモードのために書くことができるXSLTはより制限されています。さらに議論がある[ここ](http://stackoverflow.com/a/460906/523391)。 – prunge

+0

はい、それは私が言及していた2.1バージョンのXSLTの追加です。表現力を制限することは、ストリーミングするためにおそらく必要です。 –