当前位置: 首页 > 编程语言 > C#

我遇到了List的OutOfMemoryException-这是限制还是我遗漏了什么?

时间:2023-04-10 18:50:23 C#

我遇到了一个List的OutOfMemoryException-这是一个限制还是我遗漏了什么?如果我有机会重写它,我会的,但无论如何,这是代码:Listfoobar;然后我们在foobar中添加一堆字符串。在count=16777216时,我们达到了内存限制。我的理解是每个字符串的大小不同。确实查看数据(不是我的),大多数是2或3个字符。c#中数据的最大限制是多少?表示最大限制是:List当前实现中可以存储的最大元素数理论上是Int32.MaxValue——刚好超过20亿。但是:在当前的MicrosoftCLR实现中,最大对象大小限制为2GB。(其他实现可能没有此限制,例如Mono。)在我的示例中,我有1600万个结果*多少字节?任务管理器显示正在使用的演出,但我有8演出的RAM。16777216(2^24)似乎是一个相当具体的值-可疑地像一个限制,但我找不到任何文档a)支持这个或b)找到解决方法?任何帮助将不胜感激。一些代码:ListreturnList=newList();SqlDataReader博士;//在数据库上执行读取,已删除该部分,因为该位工作正常if(dr.HasRows){while(dr.Read()){returnList.添加(dr.GetString(0).Trim());这是简化的形式,我现在有一些try/catchOOMexceptions,但这是让我悲伤的实际代码。如果您尝试在64位环境中使用非常大的列表,则需要在您的应用程序配置中启用大对象。http://msdn.microsoft.com/en-us/library/hh285054.aspxOOM可能是由于Lists/ArrayLists分配内存的方式,我相信他们每次达到界限时都会尝试将内存加倍。该列表不能从2^24翻倍。理论上,您可以通过预先指定大小来最大化列表大小。(即2GB)我在这里发布了我所做的,值得一试。同样的步骤是:在每次迭代中使用存储过程来查询数据部分,将它们转移到下一部分ListreturnList;整数索引=0;SqlCommandcmd=newSqlCommand("ExampleStoredProc",conn);cmd.CommandType=CommandType.StoredProcedure;while(true){cmd.Parameters.Add(newSqlParameter("@index",index));SqlDataReaderdr=cmd.ExecuteReader();如果(dr.HasRows){returnList=newList();returnList.Add(dr.GetString(0).Trim());//在这里传输数据}else{break;}索引++;存储过程应该是这样的:CREATEPROCEDUREExampleStoredProc@indexINTASBEGINSELECT*FROMveryBigTableWHEREId>=(@index*1000)ANDId我相信不管你有多少条记录,越多您拥有的数据,完成所需的时间越长。如果在手动设置正确的列表大小时它甚至小于2^24,那么这可能是在正确的轨道上。不是达到1600万然后尝试将列表的大小加倍,而是会使列表变得非常大,尽早开始耗尽内存。这解释了为什么你得到一个整数-它上升到2^24然后试图增加大小,这导致它使用太多内存。听起来像是某种“自然”的对象大小限制,而不是列表实现中的一个。C#教程就是这样:我遇到了一个List的OutOfMemoryException-这是一个限制还是我遗漏了什么?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: