Sch*_*999 3 .net c# dictionary out-of-memory
与此相关:
System.OutOfMemoryException因为大字典
OutOfMemoryException当我让.NET管理我的字典时,我得到了.调整大小方法抛出的异常.所以我试图通过提供大量的容量来避免调整大小.当然,我试图从int.MaxValue确保它将有助于解决问题开始.我计划尽可能多地下降.
然而OutOfMemoryException被扔了int.MaxValue.我决定进行一些二进制搜索,并将构造函数接受的容量的第一个值转换为int.MaxValue / 32.这不仅比我预期的要小,而且还令人困惑.
那么有谁有任何想法为什么?
哦,项目设置设置为使用x64架构.
硬限制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,如果TKey和TValue都是4字节类型,则可能发生这种情况(指的是数组对齐大小,即CLI sizeof字节码指令返回的值).int.MaxValue / (2*16)由于.NET中的数组大小限制,这会导致条目限制.如果使用大于4个字节的TKey或TValue类型,则最大字典大小将相应减少.
对于大型词典等你的建议中,B +树索引的实现的IDictionary<TKey, TValue>将是一个更有效地利用系统资源,并且不会受到阵列大小限制.