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

时间:2013-02-18 01:51:29

标签: c# asp.net out-of-memory streamreader

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

List<string> geos = new List<string>();
using (StreamReader geoReader = new StreamReader(File.OpenRead("file.txt")))
{
    while (geoReader.EndOfStream == false)
    {
        try
        {
            geos.Add(geoReader.ReadLine());
        }
        catch (Exception ex) { }
    }
}

2 个答案:

答案 0 :(得分:2)

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

如果您确实需要加载超过1GB的内存对象,请考虑在64位进程中运行代码。

注意:上面假设你实际上没有内存,而不是试图同时进行2GB +分配 - 这将默认抛出OOM(最新的.Net允许更大的分配,据我记得)。

答案 1 :(得分:1)

我在msdn上做了一些搜索,我找到了一些可以帮助你的东西。

  

有几点需要考虑:首先,当“Process \ Virtual Bytes”在虚拟地址空间限制的600 MB范围内(通常为2 GB)时,遇到OutOfMemoryException的可能性开始急剧增加,其次,测试已经表明“Process \ Virtual Bytes”通常比“Process \ Private Bytes”大不超过600 MB。这种差异部分归因于GC维护的MEM_RESERVE区域,允许它在需要时快速提交更多内存。这意味着当“Process \ Private Bytes”超过800 MB时,遇到OutOfMemoryException的可能性会增加。在此示例中,机器具有4 GB的物理RAM,因此您需要将内存限制设置为20%以避免内存不足的情况。您可以尝试使用这些数字来最大化机器上的内存使用,但如果您想要安全地使用它,示例中的数字将起作用。      总而言之,将内存限制设置为物理RAM的60%或800 MB中较小的一个。由于v1.1支持3 GB的虚拟地址空间,如果你向boot.ini添加/ 3GB,你可以安全地使用1,800 MB而不是800 MB作为上限

http://msdn.microsoft.com/en-us/library/ms972959

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