问题描述
解决方案
解决方案二:
可能这个key不存在
解决方案三:
我意思是,Key超出了你的dictionary.count的长度
解决方案四:
超出dictionary允许的上限了
解决方案五:
引用1楼hanjun0612的回复:
可能这个key不存在
不是吧,dictionary.add(),与图中这样写效果是一样的吧
解决方案六:
引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
我意思是,Key超出了你的dictionary.count的长度
解决方案七:
说了超出分配到的内存伤上限了
解决方案八:
引用2楼hanjun0612的回复:
我意思是,Key超出了你的dictionary.count的长度
上次是这个count的两倍才报的错,int类型有这么大啊
解决方案九:
引用5楼hanjun0612的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
我意思是,Key超出了你的dictionary.count的长度
是电脑内存吗?
解决方案十:
就是电脑内存
解决方案十一:
我换了8g内存也是这种错误
解决方案十二:
引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
解决方案十三:
引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
我也是醉了。。。你看看你的dictionary.count是2893249,你的key只要大于等于2893249,就会报错。因为下标从0开始,所以实际下标只会到2893248,你看看你报错时的key是多少。
解决方案十四:
引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
额,这个是dictionary字典类,不是数组,数组下标不能超过2893248,我的key是32位随机数,会很大,所以也不至于到这一次报错,我个人感觉,讨论
解决方案十五:
引用12楼hanjun0612的回复:
Quote: 引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
我也是醉了。。。你看看你的dictionary.count是2893249,你的key只要大于等于2893249,就会报错。因为下标从0开始,所以实际下标只会到2893248,你看看你报错时的key是多少。
额,这个是dictionary字典类,不是数组,数组下标不能超过2893248,我的key是32位随机数,会很大,所以也不至于到这一次报错,我个人感觉,讨论
解决方案:
引用13楼qq_16028155的回复:
Quote: 引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
额,这个是dictionary字典类,不是数组,数组下标不能超过2893248,我的key是32位随机数,会很大,所以也不至于到这一次报错,
跟你的key有多“长”没有关系,而是你向字典中加入的单元的“个数”多于这个限制。字典中,不但可以以hash的效率查找单元,而且还维护了一个数组,用来保存高效率地将字典跟“单向枚举操作”的需求进行转换。所以字典并不是简单的一个hashset,而是综合了散列表跟数组的特性的。
解决方案:
引用14楼qq_16028155的回复:
Quote: 引用12楼hanjun0612的回复:
Quote: 引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
我也是醉了。。。你看看你的dictionary.count是2893249,你的key只要大于等于2893249,就会报错。因为下标从0开始,所以实际下标只会到2893248,你看看你报错时的key是多少。
额,这个是dictionary字典类,不是数组,数组下标不能超过2893248,我的key是32位随机数,会很大,所以也不至于到这一次报错,我个人感觉,讨论
你的key既然是随机的,那就肯定要报错。超出dictionary长度了。拜托,这个很难理解吗?和你的key是int型,长度32,内存8G有什么关系啊???dictionary的长度是3,你结果说你要找dictionary中第100个,你说能不报错?蚂蚁肚子里找大象吗?
解决方案:
Dictionary<int,int>map=newDictionary<int,int>();Randomrand=newRandom(1);for(inti=0;i<2893249+1000000;i++){varkey=rand.Next();if(!map.ContainsKey(key))map.Add(key,key);}Console.WriteLine(map.Count);
试试这个代码吗,别想这么多了,一定是你的机器内存爆了。
解决方案:
引用15楼sp1234的回复:
Quote: 引用13楼qq_16028155的回复:
Quote: 引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
额,这个是dictionary字典类,不是数组,数组下标不能超过2893248,我的key是32位随机数,会很大,所以也不至于到这一次报错,
跟你的key有多“长”没有关系,而是你向字典中加入的单元的“个数”多于这个限制。字典中,不但可以以hash的效率查找单元,而且还维护了一个数组,用来保存高效率地将字典跟“单向枚举操作”的需求进行转换。所以字典并不是简单的一个hashset,而是综合了散列表跟数组的特性的。
不是很明白,能不能说仔细一些。
解决方案:
引用16楼hanjun0612的回复:
Quote: 引用14楼qq_16028155的回复:
Quote: 引用12楼hanjun0612的回复:
Quote: 引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
我也是醉了。。。你看看你的dictionary.count是2893249,你的key只要大于等于2893249,就会报错。因为下标从0开始,所以实际下标只会到2893248,你看看你报错时的key是多少。
额,这个是dictionary字典类,不是数组,数组下标不能超过2893248,我的key是32位随机数,会很大,所以也不至于到这一次报错,我个人感觉,讨论
你的key既然是随机的,那就肯定要报错。超出dictionary长度了。拜托,这个很难理解吗?和你的key是int型,长度32,内存8G有什么关系啊???dictionary的长度是3,你结果说你要找dictionary中第100个,你说能不报错?蚂蚁肚子里找大象吗?
照你这么说,报错应该添加前面就会报啊,应该会很早报错的。我前面的key值也是大于数组长度的啊
解决方案:
引用19楼qq_16028155的回复:
Quote: 引用16楼hanjun0612的回复:
Quote: 引用14楼qq_16028155的回复:
Quote: 引用12楼hanjun0612的回复:
Quote: 引用11楼qq_16028155的回复:
Quote: 引用4楼qq_16028155的回复:
Quote: 引用1楼hanjun0612的回复:
可能这个key不存在不是吧,dictionary.add(),与图中这样写效果是一样的吧
int类型不止这么大吧
我也是醉了。。。你看看你的dictionary.count是2893249,你的key只要大于等于2893249,就会报错。因为下标从0开始,所以实际下标只会到2893248,你看看你报错时的key是多少。
额,这个是dictionary字典类,不是数组,数组下标不能超过2893248,我的key是32位随机数,会很大,所以也不至于到这一次报错,我个人感觉,讨论
你的key既然是随机的,那就肯定要报错。超出dictionary长度了。拜托,这个很难理解吗?和你的key是int型,长度32,内存8G有什么关系啊???dictionary的长度是3,你结果说你要找dictionary中第100个,你说能不报错?蚂蚁肚子里找大象吗?
照你这么说,报错应该添加前面就会报啊,应该会很早报错的。我前面的key值也是大于数组长度的啊
麻烦解释清楚一下,感谢
解决方案:
我实际测试后,超长是另一个错误。你这里是内存爆了
解决方案:
引用17楼yahle的回复:
Dictionary<int,int>map=newDictionary<int,int>();Randomrand=newRandom(1);for(inti=0;i<2893249+1000000;i++){varkey=rand.Next();if(!map.ContainsKey(key))map.Add(key,key);}Console.WriteLine(map.Count);试试这个代码吗,别想这么多了,一定是你的机器内存爆了。
解决方案:
引用21楼hanjun0612的回复:
我实际测试后,超长是另一个错误。你这里是内存爆了
进程占了500多M,我是8G的内存
解决方案:
引用23楼qq_16028155的回复:
Quote: 引用21楼hanjun0612的回复:
我实际测试后,超长是另一个错误。你这里是内存爆了进程占了500多M,我是8G的内存
我看任务管理器也是有剩余内存的
解决方案:
单独执行上面的那个片段可能并没有用。因为你的实际操作可能其他地方占用内存厉害。把你报错时的key,dictionaryMax[key],以及item都打出来看看。还有你声明dictionaryMax的方式都拉出来看。
解决方案:
引用25楼hanjun0612的回复:
单独执行上面的那个片段可能并没有用。因为你的实际操作可能其他地方占用内存厉害。把你报错时的key,dictionaryMax[key],以及item都打出来看看。还有你声明dictionaryMax的方式都拉出来看。
publicenumNodeTypes{Exact,LowerBound,UpperBound}//哈希表结点publicstructHashNodes{publicintdepth;publicintvalue;publiculongcheck;publicNodeTypestype;publicHashNodes(intDepth,intValue,ulongcheck,NodeTypesType){this.depth=Depth;this.value=Value;this.check=check;this.type=Type;}}protectedDictionary<TableKey,HashNodes>dictionaryMax=newDictionary<TableKey,HashNodes>();报错key1808356762HashNodes.check=37919220935353491HashNodes.depth=0HashNodes.type=ExactHashNodes.value=53382933
解决方案:
32位程序,每个程序可用内存空间应该是4G
解决方案:
不知道是不是你的dictionary超过2GB的问题。对于非常大Dictionary<TKey,TValue>对象,则在运行时环境(ide)中增加最大容量为20亿在64位系统的元素通过设置gcAllowVeryLargeObjects配置元素的enabled属性设置为true。<configuration><runtime><gcAllowVeryLargeObjectsenabled="true"/></runtime></configuration>
解决方案:
肯定是数量太多了下面内容引自MSDNhttps://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspxForverylargeDictionary<TKey, TValue>objects,youcanincreasethemaximumcapacityto2billionelementsona64-bitsystembysettingtheenabledattributeoftheconfigurationelementtotrueintherun-timeenvironment.上面说64位最多可以添加2亿个对象。但如果你编译时选择AnyCPU,那默认是32位的CUP,最多也就放200多万个。以前我也曾破到过这种事情。最好的解决办法是使用NOSQL数据库。或者选用64位编译。
解决方案:
引用29楼do168的回复:
肯定是数量太多了下面内容引自MSDNhttps://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspxForverylargeDictionary<TKey, TValue>objects,youcanincreasethemaximumcapacityto2billionelementsona64-bitsystembysettingtheenabledattributeoftheconfigurationelementtotrueintherun-timeenvironment.上面说64位最多可以添加2亿个对象。但如果你编译时选择AnyCPU,那默认是32位的CUP,最多也就放200多万个。以前我也曾破到过这种事情。最好的解决办法是使用NOSQL数据库。或者选用64位编译。
我试一下感谢
解决方案:
引用29楼do168的回复:
肯定是数量太多了下面内容引自MSDNhttps://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspxForverylargeDictionary<TKey, TValue>objects,youcanincreasethemaximumcapacityto2billionelementsona64-bitsystembysettingtheenabledattributeoftheconfigurationelementtotrueintherun-timeenvironment.上面说64位最多可以添加2亿个对象。但如果你编译时选择AnyCPU,那默认是32位的CUP,最多也就放200多万个。以前我也曾破到过这种事情。最好的解决办法是使用NOSQL数据库。或者选用64位编译。
感谢,我试一下
解决方案:
引用30楼qq_16028155的回复:
Quote: 引用29楼do168的回复:
肯定是数量太多了下面内容引自MSDNhttps://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspxForverylargeDictionary<TKey, TValue>objects,youcanincreasethemaximumcapacityto2billionelementsona64-bitsystembysettingtheenabledattributeoftheconfigurationelementtotrueintherun-timeenvironment.上面说64位最多可以添加2亿个对象。但如果你编译时选择AnyCPU,那默认是32位的CUP,最多也就放200多万个。以前我也曾破到过这种事情。最好的解决办法是使用NOSQL数据库。或者选用64位编译。我试一下感谢
试了一下,可以,能解释下为什么吗,还有就是程序变慢了
解决方案:
想太多伤身。。。。<runtime><gcServerenabled="false"/><!--垃圾回收服务--><gcAllowVeryLargeObjectsenabled="true"/><!--让64位系统下运行的程序可以使用超过2G的大内存--><GCCpuGroupenabled="true"/><!--指定垃圾回收是否支持多个CPU组。--><Thread_UseAllCpuGroupsenabled="true"/><!--指定运行时是否在所有的CPU组中分布托管的线程。--><gcConcurrentenabled="true"/><!--指定公共语言运行时是否在单独的线程上运行垃圾回收。--><gcTrimCommitOnLowMemoryenabled="true"/><!--自动垃圾回收.仅当禁用并发垃圾回收时才能使用此功能。--></runtime>
解决方案:
引用32楼qq_16028155的回复:
Quote: 引用30楼qq_16028155的回复:
Quote: 引用29楼do168的回复:
肯定是数量太多了下面内容引自MSDNhttps://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspxForverylargeDictionary<TKey, TValue>objects,youcanincreasethemaximumcapacityto2billionelementsona64-bitsystembysettingtheenabledattributeoftheconfigurationelementtotrueintherun-timeenvironment.上面说64位最多可以添加2亿个对象。但如果你编译时选择AnyCPU,那默认是32位的CUP,最多也就放200多万个。以前我也曾破到过这种事情。最好的解决办法是使用NOSQL数据库。或者选用64位编译。我试一下感谢
试了一下,可以,能解释下为什么吗,还有就是程序变慢了
为什么会变慢?这是字典算法本身的问题。字典是用离散算法将数据分散存入内存,数据量过多时,比如超过200万后,就会经常约发生碰撞,使效率降低。另外字典的内存空间不是一下子就分配好的,使得有些查询并不是一步就找得到。当数据在100万以内用字效率还可以,超过100万,就应该用二杈树进很查询了。