字典计数大于89478457时出错

我正在接受这个命令

Dictionary myIntDict = new Dictionary(89478458); 

这个错误:

 System.OutOfMemoryException was unhandled HResult=-2147024882 Message=Array dimensions exceeded supported range. Source=mscorlib StackTrace: at System.Collections.Generic.Dictionary`2.Initialize(Int32 capacity) at System.Collections.Generic.Dictionary`2..ctor(Int32 capacity, IEqualityComparer`1 comparer) 

在89478457上没有错误。 这是Dictionary.cs中Initialize的源代码:

  private void Initialize(int capacity) { int size = HashHelpers.GetPrime(capacity); ... entries = new Entry[size]; ... } 

当我重现它时,错误发生在数组创建上。 在这种情况下,Entry是一个结构,大小为24.当我们得到max int32(0x80000000-1)并除以24 = 89478485时,这个数字在素数89478457和89478503之间。

这是否意味着,结构数组不能像maxInt32 / sizeOfThisStruct那样大?

编辑:

是。 我实际上超过2 GB。 当字典创建struct Entry的内部数组时,会发生这种情况,其中存储了(键,值)对。 在我的例子中,sizeof(Entry)是24个字节,值类型是内联分配的。

解决方案是使用gcAllowVeryLargeObjects标志(谢谢Evk )。 实际上在.net核心中,标志是环境变量 COMPlus_gcAllowVeryLargeObjects(谢谢svick )。

是的, 狗仔队是对的。 我不得不考虑,如何不浪费记忆。 谢谢你们。

.NET运行时存在已知的限制 – 堆上允许的最大对象大小为2 GB,即使在64位版本的运行时也是如此。 但是,从.NET 4.5开始, 配置选项允许您放宽此限制(仅限64位版本的运行时)并创建更大的arrays。 启用它的配置示例如下:

      

表面上字典没有意义
您只能拥有int唯一值
你真的有我的重复吗?

UnInt32转到4,294,967,295
你为什么要浪费4个字节?

89,478,458行目前一行是12个字节
您有大约83,333,333行的1 GB
由于对象需要连续的内存,因此1 GB更具实用限制

如果值真的是一个支柱24
然后在31,250,000中1 gb

这只是一个非常大的collections品

您可以拆分为多个集合

或者使用一个类,因为它只是一个参考,我认为是4个字节