3

これに関連して:

大きなディクショナリによる System.OutOfMemoryException

OutOfMemoryException.NET に辞書を管理させると取得します。resize メソッドでスローされる例外。そのため、容量として大きな数を提供することで、サイズ変更を回避しようとしていました。int.MaxValue当然、問題の解決に役立つことを確認するために、最初から始めようとしました。必要なだけ降りるつもりだった。

ただしOutOfMemoryException、 に対してスローされint.MaxValueます。少し二分探索を行うことにしました。コンストラクターによって受け入れられた容量の最初の値は になりint.MaxValue / 32ました。それは私が予想していたよりも小さいだけでなく、混乱を招くだけでもあります.

それで、誰かが理由を考えていますか?

おっと、プロジェクト設定は x64 アーキテクチャを使用するように設定されています。

4

2 に答える 2

9

のハード リミットは、タイプ を持つDictionary<TKey, TValue>プライベート フィールドによるものです。この場合は構造体です:entriesEntry[]Entry

private struct Entry {
  public int hashCode;
  public int next;
  public TKey key;
  public TValue value;
}

の最小サイズEntryは 4*4 です。これは、TKeyTValueが両方とも 4 バイト型である場合に発生する可能性があります (配列アラインメント サイズ、つまりCLIsizeofバイトコード命令によって返される値を参照)。これにより、.NETint.MaxValue / (2*16)の配列サイズの制限により、エントリが制限されます。4 バイトを超えるor型を使用すると、それに応じて辞書の最大サイズが減少します。TKeyTValue

あなたが提案しているような大きな辞書の場合、B +ツリーの実装IDictionary<TKey, TValue>システムリソースをより効率的に使用し、配列サイズの制限を受けません。

于 2013-08-21T17:28:03.880 に答える