c# 怎么样开辟超大数组

.Net技术 码拜 4年前 (2016-02-23) 718次浏览
如题,例如代码需要开辟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#新手,望大家多多赐教~
解决方案

10

用多个数组,或用交错数组。
C#不支持超过21亿(2^31)个元素的数组,这是原因是,C#通过int去访问下标,而int最大只能表示这么多。

10

目前(包括4.0)有单个CLR对象不能超过2G的限制,而单个double[,] a已经超过这个限制了。
见SpankyJ得博客:http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx
你可能可以用double[][]。
或,用MemoeryMappingFile(建议用法)。

10

引用 6 楼 Z65443344 的回复:

double[ ][ ] a=new double[20000][ ];
for(int i=0;i<20000;i++)
{
a[i]=new double[20000];
}
循环到10000多次就内存溢出

本人机器上的测试没有问题。
其实,这么大的内存,实际使用的可能只是其中的一小部分。
这种情况可以用稀疏的数据结构。利用MemoeryMappingFile的页面机制,可以非常有效的处理超大数组。

10

.Net  必然是支持大数组。但是数组分配的空间必须是连续的。也许机器有很多空闲的内存,但是未必有足够的连续的空闲内存。
所以就出 OutOfMemoryException 了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c# 怎么样开辟超大数组
喜欢 (0)
[1034331897@qq.com]
分享 (0)