如何计算传递给Dictionary构造函数的capacity参数的最大值以避免OutOfMemoryException?

Sch*_*999 3 .net c# dictionary out-of-memory

与此相关:

System.OutOfMemoryException因为大字典

OutOfMemoryException当我让.NET管理我的字典时,我得到了.调整大小方法抛出的异常.所以我试图通过提供大量的容量来避免调整大小.当然,我试图从int.MaxValue确保它将有助于解决问题开始.我计划尽可能多地下降.

然而OutOfMemoryException被扔了int.MaxValue.我决定进行一些二进制搜索,并将构造函数接受的容量的第一个值转换为int.MaxValue / 32.这不仅比我预期的要小,而且还令人困惑.

那么有谁有任何想法为什么?

哦,项目设置设置为使用x64架构.

Sam*_*ell 9

硬限制Dictionary<TKey, TValue>是由私有字段引起的,该字段entries具有类型Entry[].在这种情况下Entry是一个结构:

private struct Entry {
  public int hashCode;
  public int next;
  public TKey key;
  public TValue value;
}
Run Code Online (Sandbox Code Playgroud)

最小大小Entry为4*4,如果TKeyTValue都是4字节类型,则可能发生这种情况(指的是数组对齐大小,即CLI sizeof字节码指令返回的值).int.MaxValue / (2*16)由于.NET中数组大小限制,这会导致条目限制.如果使用大于4个字节的TKeyTValue类型,则最大字典大小将相应减少.

对于大型词典等你的建议中,B +树索引的实现IDictionary<TKey, TValue>将是一个更有效地利用系统资源,并且不会受到阵列大小限制.