非常に多数のオブジェクトの格納を開始すると、オブジェクト割り当てのオーバーヘッドが大きな問題になります。たとえば、.NETを32ビットシステムで実行する場合、オブジェクトを割り当てるには最低16バイト必要です。 64ビットシステムでは、オブジェクトごとに最小24バイトの話があります。個々のオブジェクトが小さい場合、その割り当てオーバーヘッドは巨額の支払いコストです。
あなたは「ツリーのような構造」を持っていると言っています。アプリケーションの詳細がなければ、これは当てはまるとは言えませんが、ほとんどのツリー構造では子ノードへのポインタと親ノードへの(時には)ポインタが必要です。木ほど便利なので、時には非常に大きなオーバーヘッドが発生します。親と子のリンクがツリーで使用される総メモリの50%以上を必要とすることは珍しいことではありません。
C#では、構造体には基本的に割り当てオーバーヘッドがないため、オブジェクトではなく構造体を使用して割り当てオーバーヘッドを軽減できます。欠点は、もちろん、時には非常に不都合な値型セマンティクスに対処しなければならないことです。
多くのツリー構造を配列に折りたたんで、子リンクと親リンクを削除し、膨大なメモリを節約することも可能です。これは通常、より複雑なコードと実行時の効率の低下を犠牲にして行われます。
私の仕事では、定期的に非常に大きなコレクション(数億ノード)をメモリに保存しなければなりません。2億5,000万のレコードがメモリにある場合、ノードの4バイトごとに別の1ギガバイトのRAMが必要です。このようなデータ構造を維持するには、16ギガバイトのマシンでも、メモリの使用方法について非常に慎重な検討が必要です。
メモリ全体を保持する必要がある場合は、できる限りツリーノードの構造体を作成することをお勧めします。また、ツリーを格納する別の方法(親または子への明示的なリンクを排除する方法)を検討する必要があります。あなたの特定のアプリケーションについてさらに詳しい情報がなければ、私はより具体的な推奨をすることはできません。
サードパーティ(私の会社:)によって設定された解決策に制限があります。動的に定義されたDataSetを作成し、GCを強制しました。ヒント/ヒントありがとう! –