私の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文字列が文字列の実際の文字の前後に文字列のサイズを格納すると仮定しています.ノード名/値の。これにより、オーバーヘッドが効果的に増加し、保存されたデータのサイズに一致します。