求助,Dictionary添加数据的时候报错,详情见图

问题描述

解决方案

解决方案二:
可能这个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万,就应该用二杈树进很查询了。

时间: 2024-11-01 20:26:53

求助,Dictionary添加数据的时候报错,详情见图的相关文章

mysql-测试hibernate框架自动建表并保存数据,没报错,但数据只保存了一部分

问题描述 测试hibernate框架自动建表并保存数据,没报错,但数据只保存了一部分 解决方案 因为你去给Product这个对象创建三个实例,pro.pro2.pro3,对吧,然后你不停的给pro去赋值(pro.setName()),最后pro的最后一个值把前两个覆盖掉了,所以只添加了一个棉花糖.正确的方式是要给每个,你把第29行改成pro2.setName():30行pro2.setDir():33行pro3.setName():34行pro3.setDir(),就万事大吉了,祝你成功! 解决

spring jpa 实体互相引用返回restful数据循环引用报错的问题

spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLabel ProblemLabel对象,引用了所属Problem 这样构成了互相引用,导致递归循环内存溢出异常: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: I

oracle数据库-oracle 创建的dblink导入数据不成功报错

问题描述 oracle 创建的dblink导入数据不成功报错 执行数据导入时报:ORA-24777: 不允许使用不可移植的数据库链路

ssh整合-java Web 中提交数据信息时 报错

问题描述 java Web 中提交数据信息时 报错 Entering nullPropertyValue [target=[com.shyou.action.BusinessShopAction@1178dc3, com.opensymphony.xwork2.DefaultTextProvider@cbd684], property=bShop] Error setting expression 'bShop.personCharge' with value '[Ljava.lang.Stri

大数据-orcale大量数据分组查询报错求大神指点

问题描述 orcale大量数据分组查询报错求大神指点 对一个表数据进行分组查询,但是数据量太大了,当时是3000w条,跑着就报错了,数据库内部错误,也不是很懂.想请教下group by的时候是否数据量太多会报错,如果是它可以承受多大的数据量分组查询. 解决方案 肯定会报错,数据量大就会请求超时 解决方案二: 建议使用索引,给需要分组的字段加索引 解决方案三: 你可以试试根据你当前数据库的配置情况,进行分组查询的时候,使用多线程的方式进行查询 例如: select /*+ parallel(t,1

client-关于cxf客户端添加拦截器会报错呢?

问题描述 关于cxf客户端添加拦截器会报错呢? 具体代码如下: WebServiceImp is = new WebServiceImp(); IwebService ws = is.getWebServiceImpPort(); Client client = ClientProxy.getClient(is); 报以下错误: Exception in thread "main" java.lang.IllegalArgumentException: not a proxy inst

.net-C# webservie 传递一个大型byte数据,服务报错

问题描述 C# webservie 传递一个大型byte数据,服务报错 C# webservie 传递一个大型byte数据(几十M),服务报错下面是异常信息 System.ServiceModel.CommunicationException: 接收对 h**p://****:6941/UploadData.asmx 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见

gradle-Android studio 添加jar后编译报错

问题描述 Android studio 添加jar后编译报错 添加了一个mysql-connector-java-5.1.38-bin.jar 然后编译就报错了 错误信息如下: Error:Error converting bytecode to dex: Cause: Dex cannot parse version 52 byte code. This is caused by library dependencies that have been compiled using Java 8

sqoop从MySQL导入数据到hive报错 class not found

问题描述 sqoop从MySQL导入数据到hive报错 class not found 解决方案 sqoop 导入oracle 报错 Imported Failed : Attempted to generate class with no columns问题解决办法mysql启动报错 MySQL manager or server PID file could not be found! [FAILED]启动HIVE 服务报错 HWI WAR file not found 解决方案二: 您好,