c# 如何开辟超大数组

fdscfv 2014-06-26 04:28:43
如题,比如代码需要开辟20000×20000的数组,按如下方式声明
double[,] a = new double[20000, 20000];
就会有System.OutOfMemoryException错误。
我的操作系统是windows server 2008 R2 Enterprise,64位,内存64G,内存方面是够用。

网上查到了利用<gcAllowVeryLargeObjects>在.NET 4.5平台上开辟超过2G数组的方法,但我用了之后还是出现相同问题,不知是不是我的用法有问题?
我是在vs2012中新建一个.net 4.5的C#工程后,在解决方案的App.config里写入
<configuration>
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>
然后再运行程序的。可是这样依然会报内存溢出错误。
不知是不是我的<gcAllowVeryLargeObjects>用法有问题?还有没有其他办法可以开辟超大数组的?
C#新手,望大家多多赐教~
...全文
2232 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35472035 2016-07-06
  • 打赏
  • 举报
回复
楼主能把代码粘贴出来吗?
fdscfv 2014-06-30
  • 打赏
  • 举报
回复
引用 10 楼 u013523101 的回复:
动态数组不能满足你的要求吗?
其实就是矩阵运算的需要,这个替代方案确实都有~我就是纯属想了解一下怎么开超大数组
happy_Can 2014-06-30
  • 打赏
  • 举报
回复
动态数组不能满足你的要求吗?
fdscfv 2014-06-30
  • 打赏
  • 举报
回复
感谢大家的回答,后来我找到原因所在了,我的vs的活动解决方案平台还是x86的,所以没法开辟2G以上的数组。 把平台改成x64的,再配合<gcAllowVeryLargeObjects>,就可以开超过2G的数组了
CGabriel 2014-06-26
  • 打赏
  • 举报
回复
.Net 必然是支持大数组。但是数组分配的空间必须是连续的。也许机器有很多空闲的内存,但是未必有足够的连续的空闲内存。 所以就出 OutOfMemoryException 了。
gomoku 2014-06-26
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
double[ ][ ] a=new double[20000][ ]; for(int i=0;i<20000;i++) { a[i]=new double[20000]; } 循环到10000多次就内存溢出了
我机器上的测试没有问题。 其实,这么大的内存,实际使用的可能只是其中的一小部分。 这种情况可以用稀疏的数据结构。利用MemoeryMappingFile的页面机制,可以非常有效的处理超大数组。
於黾 2014-06-26
  • 打赏
  • 举报
回复
double[ ][ ] a=new double[20000][ ]; for(int i=0;i<20000;i++) { a[i]=new double[20000]; } 循环到10000多次就内存溢出了
於黾 2014-06-26
  • 打赏
  • 举报
回复
引用 4 楼 gomoku 的回复:
目前(包括4.0)有单个CLR对象不能超过2G的限制,而单个double[,] a已经超过这个限制了。 见SpankyJ得博客:http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx 你可能可以用double[][]。 或者,用MemoeryMappingFile(建议用法)。
试了,double[][]也不行.
gomoku 2014-06-26
  • 打赏
  • 举报
回复
目前(包括4.0)有单个CLR对象不能超过2G的限制,而单个double[,] a已经超过这个限制了。 见SpankyJ得博客:http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx 你可能可以用double[][]。 或者,用MemoeryMappingFile(建议用法)。
threenewbee 2014-06-26
  • 打赏
  • 举报
回复
用多个数组,或者用交错数组。 C#不支持超过21亿(2^31)个元素的数组,这是因为,C#通过int去访问下标,而int最大只能表示这么多。
gqqnb 2014-06-26
  • 打赏
  • 举报
回复
似乎C#不支持超大数组。请问这个超大数组要用来做什么?可以有替代方案吗?
Dogfish 2014-06-26
  • 打赏
  • 举报
回复
楼主看看这个回答。 http://stackoverflow.com/questions/5791868/large-array-c-sharp-outofmemoryexception

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧