C#编写大计算量程序总是报内存溢出System.OutOfMemoryException的重要原因

笔者为C#业余爱好者,从开始编写一些计算量较大、内存占用较大的程序时,经常会在编译时报出System.OutOfMemoryException(内存溢出)的错误异常,而实际上,当时的剩余内存还多的是,最终只能改变原有算法,尽量减少内存占用。
在这里插入图片描述

   我至少经历过以下一些场景的内存溢出提示:
   1、使用DataTable或者DataSet,明明没有达到二者的最大行数闲置,却报出了内存溢出异常;
   2、使用系统类库,逐行读取一个超大的TXT文件时,读到一定程度报内存溢出;
   3、在数组、List中存入过多的数据,时不时报出内存溢出问题。
  而这些情况在发生时,电脑的物理内存,明明剩余很多,可能剩余内存多大十几GB,并且似乎,每次报出内存溢出时,该程序占用的内存大概只有2.8~3GB左右。

如果你也碰到了此类情况,并且看到了本文,恭喜你,找到了此类问题的根本原因和解决办法,不用再去费尽心机修改代码以节省内存占用了。

众所周知,处理器区分32位和64位,操作系统也区分32位和64位,并且二者遵循如下关系:
1、在32位处理器的电脑上,只能看装32位操作系统
2、在64位处理器的电脑上,既能安装32位也能安装64位操作系统。
而对于应用程序来说:
1、在32位操作系统上,只能运行32位(X86)的程序
2、在64位操作系统上,既能运行32位(X86)的程序,也能运行64位程序(X64)。

对于操作系统的内存支持上来说,操作系统识别的物理内存:
1、在32位操作系统上,最大支持2^32=4GB的内存,由于一部分内存地址作为硬件等其他设备的专用进行保留,留给应用程序可用的一般在3.25GB左右
2、在64位操作系统上,最大支持2^64bit的内存,换算成GB是多大呢?可以明确的告诉你,非常大,按照当前的计算机技术,接近无限大了(超过PB级别),但是受限于 CPU,现在一般民用级别的处理器,基本最大64GB,服务器轻松上256GB

科普完了,接下来是重点:
一般对电脑有所了解的亲们,基本上对上面的32、64位操作系统等基本都了解了,但是我们往往忽略了一个重要的问题-应用程序本身!
因为应用程序运行的环境是在操作系统,32位的应用程序在64位的操作系统运行时,也会受到内存寻址的限制,也是4GB最大,除去专用地址,实际在3GB左右。
上述C#程序运行时报错的真正原因正是如此,C#编译器Visual Studio,默认的编译目标就是X86,也就是32位,在内存占用到3GB左右,几乎100%的抛出内存溢出错误。无论你的剩余物理内存有多少!

解决起来就要简单的多了,直接将解决方案的目标平台设置为64位,即X64,即可消除上述各种内存溢出的问题,虽说编写程序要节省内存,但对于安装内存较大的机器,占用更多的内存,实现更快的计算,何乐而不为呢?

具体的解决办法如下:
一、在VS的解决方案资源管理器中,选中解决方案,右键→属性
在这里插入图片描述
二、左侧选中“生成”选项卡
将目标平台设置为X64即可
在这里插入图片描述
经过上述的设置后,单个应用程序的内存占用即可得到充分释放。
笔者电脑4+16总计20GB,经过测试,最大可将整个系统的全部剩余内存全部用完,也不会报内存溢出错误。

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值