2

そのため、しばらくの間、XslCompiledTransform を使用してきました。これは、XslTransform が非推奨になったため、使用する必要があると Microsoft が指示したためです。最近、ほぼ 100,000 行 (生成された xsl - もちろん) の変換で使用する必要がありました。アプリケーションを使用したとき、OOM ポップアップが表示されてショックを受けました。私が何をしたとしても-OOMだけが私が得るすべてです...くすくす笑いのために、私はXslTransformに戻りました... XslCompiledTransformをXslTransformに変更する同じ正確なコードで、正常に動作します...

OOM を回避する方法を教えてもらえますか? XslCompiledTransform に「スイッチ」はありますか? 正確な問題をどのように再現できるかはわかりませんが、誰かが答えを持っていれば、彼らは大歓迎です.

ありがとう - 以下のコード:

作品:

XslTransform myXslTransform = new XslTransform();
myXslTransform.Load(xslWith100ThousandLines);
MemoryStream m = new MemoryStream();
myXslTransform.Transform(myXPathDocument, null, m);
m.Flush();
m.Close();

OOM で失敗する

XslCompiledTransform cxslt = new XslCompiledTransform();
cxslt.Load(xslWith100ThousandLines);
MemoryStream m = new MemoryStream();
cxslt.Transform(myXPathDocument, null, m);
m.Flush();
m.Close();
4

4 に答える 4

0

最初は、Microsoft Connect にバグとして報告する必要があると思っていましたが、今考えると、バグではありません。XSL ドキュメントがこれだけ大きい場合、OOM 例外が発生する可能性が高くなります。

XslTransform が失敗しないときに新しい XslCompiledTransform が失敗するとは思わないという理由だけで、私はまだそこに投稿します。

結果のドキュメントが大きい場合は、ドキュメントをディスク上の一時 FileStream に保存し、ドキュメントの処理中にそこから作業しますか?

于 2009-01-13T20:56:53.917 に答える
0

驚いたことに、古い XslTransform が新しい XslCompiledTransoform にチェーンされているだけという印象を受けました。

最初の使用で OOM を取得しましたか? コンパイルされたもの (XslCompiledTransoform、XmlSerializer、RegexOptions.Compiled を使用した Regex) は、アセンブリを AppDomain に読み込みます。AppDomain に追加されたアセンブリは削除できません。ここにはいくつかのオプションがあります。

  1. アセンブリを別の AppDomain に読み込み、作業が完了したらその AppDomain を削除します。これはかなり複雑で難しいです。このようにすると、アプリケーションは使用済みメモリを解放できます。
  2. XslCompiledTransforms のキャッシュを作成します。二度と変換を作成しないでください。この方法により、アプリケーションはメモリ使用量の増加を抑えることができます。事前に XSL を (ハッシュ + ベース 64)/チェックサムし、その文字列を辞書のキーとして使用することができます。

設計時にその XSLT ファイルを生成している場合は、それによって作成されたアセンブリを取得し、XSLT の代わりにアプリケーションにパッケージ化する価値があります。実行時の場合は、上記のオプション (1) を使用する必要があります。

于 2009-01-14T08:22:16.030 に答える