【发布时间】:2023-03-12 12:15:01
【问题描述】:
我正在执行此命令
Dictionary<UInt64, int> myIntDict = new Dictionary<UInt64, int>(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 的内部数组时,就会发生这种情况,(key,value) 对存储在哪里。在我的例子中,sizeof(Entry) 是 24 字节,并且作为值类型是内联分配的。
解决方案是使用gcAllowVeryLargeObjects 标志(谢谢Evk)。实际上在 .net 核心中,标志是the environment variable COMPlus_gcAllowVeryLargeObjects(谢谢svick)。
是的,Paparazzi 是对的。我得想一想,如何不浪费内存。 谢谢你们。
【问题讨论】:
-
我想知道你为什么需要这么大的字典?这种考验的真正实用性是我所质疑的
-
@BenPhilipp Int 仅用于测试。实际上是一个结构体。
-
@MukeshAdhvaryu 你将使用什么来创建稀疏 3d 数组。
标签: c# .net-core .net-core-rc2