C# 是什么导致asp.net内存不足异常

C# 是什么导致asp.net内存不足异常,c#,asp.net,out-of-memory,streamreader,C#,Asp.net,Out Of Memory,Streamreader,我有一个简单的asp.net网站,它将一个大文本文件读入内存并进行一些处理。下面是引发OOM异常的代码。在阅读了大约350k行之后,我得到了这个错误。每行平均有1k个字符。IIS或ASP.Net网站是否存在内存限制?我的服务器还有很多物理内存。谢谢 List geos=new List(); 使用(StreamReader georreader=newstreamreader(File.OpenRead(“File.txt”)) { while(geoReader.EndOfStream==fa

我有一个简单的asp.net网站,它将一个大文本文件读入内存并进行一些处理。下面是引发OOM异常的代码。在阅读了大约350k行之后,我得到了这个错误。每行平均有1k个字符。IIS或ASP.Net网站是否存在内存限制?我的服务器还有很多物理内存。谢谢

List geos=new List();
使用(StreamReader georreader=newstreamreader(File.OpenRead(“File.txt”))
{
while(geoReader.EndOfStream==false)
{
尝试
{
Add(geoReader.ReadLine());
}
捕获(例外情况除外){}
}
}

您的工作进程很可能配置为32位(x86)。在这种情况下,您将至少找到大约2GB的已分配对象,但很可能更早

如果你真的需要加载多于1GB的内存对象,考虑在64位进程中运行你的代码。


注意:以上假设您实际内存不足,而不是像尝试立即执行2GB+分配那样-默认情况下会抛出OOM(据我所知,最新的.Net允许更大的分配)。

我在msdn上进行了一些搜索,发现了一些可能对您有所帮助的东西

有两件事需要考虑:首先,当“进程\虚拟字节”在虚拟地址空间限制的600 MB以内(通常为2 GB)时,发生OutOfMemoryException的可能性开始显著增加;其次,测试表明,“进程\虚拟字节”通常大于“进程\专用字节”不超过600 MB。这种差异部分是由于GC维护的MEM_保留区域,允许它在需要时快速提交更多内存。总之,这意味着当“进程\专用字节”超过800 MB时,发生OutOfMemoryException的可能性会增加。在本例中,机器有4 GB的物理RAM,因此需要将内存限制设置为20%,以避免出现内存不足的情况。您可以尝试使用这些数字来最大限度地利用计算机上的内存,但如果您想安全起见,示例中的数字将起作用。 总之,将内存限制设置为物理RAM的60%或800 MB中的较小值。由于v1.1支持3 GB虚拟地址空间,如果将/3GB添加到boot.ini,则可以安全地使用1800 MB而不是800 MB作为上限


另一个可能的原因可能是未安装.NET Framework 1.1的Service Pack 1。我猜在未安装service pack的情况下发生内存异常的可能性更高。

设置adplus以捕获崩溃时的内存转储-语法类似于:adplus-crash-iis:在.NET中确实存在内存限制。在处理数据之前,你不能将数据分成块吗?你可能会弄乱内存限制,但这是一种脆弱的方法,一个更大的文件,处理更多的内存对象,只会耗尽它。要注意的是,在你可以使用这些数据做任何事情之前,你是否需要在内存中存储所有这些数据。OOM是指网络进程内存不足,而不是你的机器,事实上,它甚至在收集之后都找不到一个连续的空闲内存块。那么你用你的列表做什么呢?如果源文件有大量数据,为什么不使用异步操作为每一行执行操作,而不是将其存储在列表中?无论系统内存如何,如果此操作是响应客户端请求,这是一种非常昂贵的方法。350*1000*1000=350mb。你是说错误发生在350000行之后,但可能还有更多行?如果10个人同时运行同一个请求,会发生什么情况?如果有人厌倦了等待并点击刷新10次怎么办?3.5大杯没了。正如Alexei所说,如果您真的需要使用这么多内存,请运行64位体系结构。否则,考虑重新设计。