为什么ReadToEnd会抛出OutOfMemory异常但ReadAllText却没有?

时间:2011-06-16 22:43:54

标签: c# .net file-io out-of-memory

我遇到一个问题,当ReadToEnd尝试读取ASP.net网站中的16MB文本文件时会抛出OutOfMemory异常。

在调查原因的同时,我遇到了File.ReadAllText,这正是我正在做的事情,我并不关心如何获取文本。

但是看一下ReadAllText的文档,它没有提到OutOfMemory异常的可能性。这是为什么?它是否以不同于ReadToEnd的方式实现,以至于它不太可能耗尽内存,或者如果内存不足会引发其他异常?

修改添加代码只是为了展示我目前正在做的事情:

StreamReader inputFile = System.IO.File.OpenText(filename);
string cacheData = inputFile.ReadToEnd();
inputFile.Close();

有时我在第2行得到OutOfMemory异常。没有进行解析,文件只有16M的文本,我知道并不奇怪。

重新启动IIS通常会修复它。但是当我收到错误时,我有2G的RAM可用,IIS可能会达到内部限制吗? w3wp.exe进程通常使用350-500M(这是Windows Server 2003上的IIS 6)

4 个答案:

答案 0 :(得分:6)

来自Reflector,System.IO.File类:

public static string ReadAllText(string path, Encoding encoding)
{
    using (StreamReader reader = new StreamReader(path, encoding))
    {
        return reader.ReadToEnd();
    }
}

就像那样。

答案 1 :(得分:1)

如果您尝试读取包含太多文本以适合内存的文件,那么

ReadAllText会抛出OutOfMemory异常 - 刚试过它。

答案 2 :(得分:1)

This post很好地解释了为什么我遇到了原始的OutOfMemory错误。 32位Windows Server 2003上的IIS 6.0只能使用大约600-700M的内存,即使我有4GB。

向boot.ini添加/ 3GB并重新启动服务器使错误消失(即使我的IIS内存使用量似乎远远超过它原来的水平)。

答案 3 :(得分:0)

我遇到了与C#Windows窗体应用程序相同的问题。使用设置为64位的目标平台构建我的应用程序解决了这个问题。