web-dev-qa-db-ja.com

C#でのハッシュテーブルと辞書の実用的なサイズ制限

C#4ディクショナリまたはハッシュテーブルに含めることができる項目の数、およびこれらの構造に適切に含めることができる合計バイト数の実際的な制限は何ですか。私は多数のオブジェクトを処理する予定であり、これらの構造に問題が発生し始める時期を知りたいです。

コンテキストとしては、大量のメモリを搭載した64ビットシステムを使用します。また、何らかのフォームまたは「キー」を使用してオブジェクトを検索する必要があります。パフォーマンスの要求を考えると、これらのオブジェクトはメモリに常駐する必要があり、多くのオブジェクトは長命です。

他のアプローチやパターンを自由に提案してください。ただし、サードパーティまたはオープンソースのライブラリの使用は避ける必要があります。仕様上の理由から、ネイティブC#(またはC++\CLI)を使用してこれを構築できるようにする必要があります。

12
JoeGeeky

指摘すべきことの1つは、ディクショナリはオブジェクト自体(大きなメモリフットプリントを持つ可能性があります)を保持するのではなく、オブジェクトへの参照のみを保持するため、オブジェクトが複雑な場合、ディクショナリのサイズに影響を与えないことです。

メモリ内のディクショナリに数千のアイテムをまとめて収集しましたが、問題はディクショナリのサイズではなく、メモリ内のオブジェクト自体のサイズです。これらの場合、辞書自体が関係するメモリのごく一部でした。

大規模な辞書の場合に考慮すべき1つのことは、辞書の容量を手動で構成および管理することです。通常の状況下では、.Netがこれを適切に管理します(現在の実装では、スペースが不足すると、現在のディクショナリサイズの2倍の素数にサイズ変更されます)。ただし、大規模なディクショナリを作成するか、.Netでディクショナリを推測してサイズ変更する代わりにディクショナリを拡張することがわかっている場合(これは比較的コストがかかります)、おそらくこれを自分で行うほうがよいでしょう(確かに最初のサイズおよびおそらく管理は後でサイズ変更されます)。これは、ディクショナリのキャパシティがどうあるべきかについて合理的なヒューリスティックなアイデアがある場合、ディクショナリのキャパシティを管理することで実行できます。マイクロソフトでは、これを Dictionaryオブジェクトに関する備考のMSDN で推奨しています。ただし、 このアプローチの実際の値 についてはいくつかの議論があるようですが、そのテストがどれほど厳密であるか、および辞書が存在するときに.Netプラットフォームが導入する他の最適化があるかどうかはわかりません非常に急速にサイズ変更。

これは便利です スタックオーバーフローの質問 オブジェクトとメモリサイズについて。

8
AlexC

実際の制限は、ソフトウェアが実行されているマシン、およびこれらのデータ構造内に実際に含める予定のオブジェクトの数に関連する場合があります。 Odedが述べたように、int.MaxValueは多数ですが、20億の項目は実際的な制限と同じですか?その多くのアイテムをメモリに格納することは、あまり実用的ではありません。

2
Bernard

ドキュメントにはデータが物理的にどこに保存されているかが示されておらず、制限も指定されていないため、予想される最大予想サイズで実験を行い、ストレージ割り当ての前後にシステムメモリを記録することをお勧めします。

0
NoChance