2

XmlDocument を使用する .NET Web アプリケーションで非常に高いメモリ使用量が見られます。小さな (最大 5 MB) XML ドキュメントが XmlDocument オブジェクトに読み込まれ、HttpContext.Cache に格納されるため、ページの読み込みごとに簡単にクエリと XSLT 変換を行うことができます。XML は定期的にディスク上で変更されるため、キャッシュはファイルに依存します。

このようなアプリケーションは、数百メガバイトの RAM を使用しているようです。

リクエストの開始ごとにガベージ コレクションをリクエストして実験しましたが、これにより RAM の使用量がはるかに低く抑えられますが、これが適切な方法であるとは思えません。

RAM の使用量を減らして同じ目標を達成する方法について、何か提案はありますか?

4

2 に答える 2

6

私の2セント。. .

XML ドキュメントのサイズに基づいてメモリ使用量が指数関数的になるかどうか心配です。たとえば、1 MB の XML ファイル メモリは 10 MB で安定し、2 MB は 30 MB で平らになります。

また、XML ファイルのコストについては、バイト サイズではなく、各ノードのコストを考慮してください。5 MB の XML ドキュメントに 2 つのデータ ノードがある場合、ドキュメントのメモリ内表現は 5 MB をはるかに超えることはありません (実際には、XML のバイナリ データが 2 倍になることを考えると、はるかに小さい可能性があります)。メモリー)。

*XML ドキュメントが utf-8 で、2 つの大きなテキスト ノードがある場合、メモリ内表現は 10 MB になる可能性があります (テキストは、Unicode である .net 文字列に格納でき、標準の 2 倍の幅になります)英語の UTF-8 テキスト)。

XML ドキュメントが多数の個別の文字列値で構成されている場合、すべてのノードがオブジェクトであり、すべてのノード名がオブジェクトであり、すべてのノード値がオブジェクトです。したがって、参照が 4 バイトであると仮定すると、ノードごとに (少なくとも) 余分な 12 バイトになります。

ここで、多数のノードがあり、ノード名と値の平均の長さが 20 文字であると仮定すると、5 MB ファイルの参照オーバーヘッドは 3 MB であり、さらに utf-8 から Unicode への変換に 100% 余分にかかる可能性があります。 5MBのXMLファイルを保存するには、5MB + 5MB + 3MB(少なくとも)= 13MB(少なくとも)のRAMが必要です。. . これは、メモリの配置に失われたバイト数や、各文字列オブジェクトのサイズを格納するために使用される余分なバイト数をカウントしていません**

また、XML ドキュメントをキャッシュしているため、これらすべてのオブジェクトがすぐにジェネレーション 2 の収集可能なオブジェクトになることも考慮してください。これは、基本的に、GCが収集できるものを確認するためにかなりのヒープを歩くのが非常に面倒であることを意味します。

GC Collect を呼び出しても問題ない場合だけでなく、呼び出す必要がある場合については、 Rico Mariani の When to call GC.Collect()を参照してください。

これが役に立てば幸いです。メモリ サイズについて合唱団に説教している場合は申し訳ありません。

*これが実際に当てはまるかどうかはわかりませんが、そうでない場合は驚くでしょう。
**私は.net文字列が文字列の実際の文字の前後に文字列のサイズを格納すると仮定しています.ノード名/値の。これにより、オーバーヘッドが効果的に増加し、保存されたデータのサイズに一致します。

于 2010-04-06T13:24:24.550 に答える
1

積極的な GCing は物事をクリーンアップするので、実装しているオブジェクトを破棄していない可能性がある場所を探す必要がありますIDisposable。おそらく、XSL Transform を使用してコードを調べ、そこで使用されているオブジェクトが適切に破棄されていることを確認する必要があります。

于 2010-04-06T10:58:30.103 に答える