字典计数大于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个字节
- ASP.Net核心MVC6未经授权重定向到登录
- 如何在.NET Core中从流加载程序集
- Asp.Net Core 2.0 Kestrel不提供静态内容
- 如何将自定义角色添加到ASP.NET Core
- 通过通用接口/抽象类实现使.NET Core DI自动解析类
- 如何将WebClient与.NetCore一起使用?
- VS.NET 2017强制在ASP.NET 2.0 Core应用程序中使用StackExchange.Redis 1.2.4.0
- .net核心dependency injection是否支持Lazy
- Microsoft.DotNet.Common.Targets(262,5):错误:对象引用未设置为对象的实例