如何计算传递给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,如果TKey
和TValue
都是4字节类型(指的是数组对齐大小,即CLI字节码指令返回的值),则可能发生这种情况。 由于.NET中的数组大小限制,这会导致int.MaxValue / (2*16)
条目的限制 。 如果使用大于4个字节的TKey
或TValue
类型,则最大字典大小将相应减小。
对于你所建议的大字典, IDictionary
的B + -tree实现将更有效地使用系统资源,并且不受数组大小限制。
只是添加到280Z28的答案:
如果你真的必须有这么大的字典,并且你在x64上运行,并且你使用.Net 4.5或更高版本,那么你可以启用大对象支持。 这将允许更大的字典。
在我的测试中,我可以指定容量高达int.MaxValue/2
为此,请在“app.config”文件中添加如下部分:
所以你的整个“app.config”文件可能如下所示:
有关更多详细信息,请参见此处: http : //msdn.microsoft.com/en-us/library/hh285054.aspx