3

我有一个简单的 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) { }
    }
}
4

2 回答 2

2

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

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

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

于 2013-02-18T02:23:01.023 回答
1

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

有几件事需要考虑:首先,当“Process\Virtual Bytes”在虚拟地址空间限制(通常为 2 GB)的 600 MB 以内时,遇到 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 虚拟地址空间,如果将 /3GB 添加到 boot.ini,则可以安全地使用 1,800 MB 而不是 800 MB 作为上限

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

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

于 2013-02-18T03:18:18.180 回答