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

与此相关:

System.OutOfMemoryException因为大字典

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

但是为int.MaxValue抛出了int.MaxValue 。 我决定进行一些二进制搜索,构造函数接受的容量的第一个值变为int.MaxValue / 32 。 这不仅比我预期的要小,而且还令人困惑。

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

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

Dictionary的硬限制是由私有字段entries ,其Entry[] 。 在这种情况下, Entry是一个结构:

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

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

对于你所建议的大字典, IDictionary的B + -tree实现将更有效地使用系统资源,并且不受数组大小限制。

只是添加到280Z28的答案:

如果你真的必须有这么大的字典,并且你在x64上运行,并且你使用.Net 4.5或更高版本,那么你可以启用大对象支持。 这将允许更大的字典。

在我的测试中,我可以指定容量高达int.MaxValue/2

为此,请在“app.config”文件中添加如下部分:

    

所以你的整个“app.config”文件可能如下所示:

          

有关更多详细信息,请参见此处: http : //msdn.microsoft.com/en-us/library/hh285054.aspx