c# 开辟超大数组 System.OutOfMemoryException问题

sky_whale 2010-09-07 11:32:51
由于科学计算需要,程序中需要调用2个超大规模的矩阵(70000*70000),但是在vs里超过16000*16000的数组,比如

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

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

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

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

急求解决方案,望各位牛人不吝赐教。
...全文
1949 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
winjan163 2012-10-20
  • 打赏
  • 举报
回复
我有同样的问题没得到解决
hyblusea 2010-09-07
  • 打赏
  • 举报
回复
我来学习一下...
jointan 2010-09-07
  • 打赏
  • 举报
回复
那可以按数据块分别放到不同的内存流中(MemoryStream),读取时先根据索引去推断是哪块内存流保存该数据的位置,然后从该块内存流内读取并返回

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

足球中国 2010-09-07
  • 打赏
  • 举报
回复
楼主弄啥东西的。我最近也弄这个东西。还没理清头绪。
sky_whale 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jointan 的回复:]
可以把数据放到一个磁盘文件中,操作文件流

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 B……
[/Quote]

这个我也想过,但是之所以存到内存里是为了提高运算速度。
Ken920454 2010-09-07
  • 打赏
  • 举报
回复
我不知道如何解,但是想说的是System.OutOfMemoryException错误产生的原因不一定就是内存不够。

一些其他的限制也可能产生这一类错误。

不要忘物理内存不足上想。
jointan 2010-09-07
  • 打赏
  • 举报
回复
可以把数据放到一个磁盘文件中,操作文件流

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);
}

兔子-顾问 2010-09-07
  • 打赏
  • 举报
回复
http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/1a12abaa-50bd-4d28-b3c1-9de06a1488e9
这里讨论了一个创建超过2G的数组。看是否对你有帮助。
sky_whale 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]
http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/1a12abaa-50bd-4d28-b3c1-9de06a1488e9
这里讨论了一个创建超过2G的数组。看是否对你有帮助。
[/Quote]

太感谢了,很有帮助。

111,126

社区成员

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

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

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