日期:2014-05-17  浏览次数:21273 次

c# 开辟超大数组 System.OutOfMemoryException问题
由于科学计算需要,程序中需要调用2个超大规模的矩阵(70000*70000),但是在vs里超过16000*16000的数组,比如

double[,] m = new double[16000, 16000];

就报System.OutOfMemoryException异常。原先以为是运行环境的问题,但是更新硬件和软件后也报同样的错误。

编译环境:vs2010 x64
操作系统:server2008 R2 x64
内存:16G

基本要求:由于程序已经用c#开发了好几年了,再改换别的语言工作量太大了,只能用c#。

急求解决方案,望各位牛人不吝赐教。

------解决方案--------------------
http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/1a12abaa-50bd-4d28-b3c1-9de06a1488e9
这里讨论了一个创建超过2G的数组。看是否对你有帮助。
------解决方案--------------------
可以把数据放到一个磁盘文件中,操作文件流

double GetItem(int row,int col)
{
int position=row*70000+col;
stream.Seek(position,SeekOrigin.Begin);
byte buffer=new byte[8];
stream.Read(buffer,0,8);
return BitConverter.ToDouble(buffer,0);
}


------解决方案--------------------
那可以按数据块分别放到不同的内存流中(MemoryStream),读取时先根据索引去推断是哪块内存流保存该数据的位置,然后从该块内存流内读取并返回

不太清楚64位的.Net程序每个进程可以管理的内存泛围有多大.如果进程的最大内存无法满足你的要求的化,要么换其他语言,要么用磁盘文件.