处理System.OutOfMemoryException

时间:2012-02-15 16:26:42

标签: c# asp.net .net

鉴于此代码:

readFile = new FileStream(FilePath, FileMode.Open);
streamReader = new StreamReader(readFile);

dsSheet = new DataSet();
dsSheet.Tables.Add(sValidNumbersLibrary);
dsSheet.Tables[sValidNumbersLibrary].Columns.Add("Numbers");
dt50Records = dsSheet.Tables[sValidNumbersLibrary].Clone();

String sLine = string.Empty;
sLine = streamReader.ReadToEnd();
// The next line fails with System.OutOfMemoryException:
sLine = (sLine.Contains(",")) ? sLine.Replace(",", "\r\n") : sLine;
sLine = sLine.Replace("\r\n", ",");

我该如何处理System.OutOfMemoryException

3 个答案:

答案 0 :(得分:0)

我会添加

streamReader.Dispose();

在sLine = streamReader.ReadToEnd()之后; 这将在您启动替换过程之前释放一些内存。

答案 1 :(得分:0)

我同意之前的评论,你应该以块的形式阅读文件,但如果你必须立即将整个块读入内存:

String.Replace()返回字符串的副本,因此在替换之后,您使用的内存是以前的两倍。请尝试使用StringBuilder.Replace(),或者如果您真的按下RAM,请将字符串加载到字节数组中并操作字符串内联。 (虽然,因为你用两个字符替换一个字符,这会带来一些问题。)

我会考虑并重温这一点。

答案 2 :(得分:0)

一旦完成操作,你打算用改变后的字符串做什么?如果您只是将其写入文件,那么您可能应该一次读取一行,执行操作,然后将更改的行写入文件。 StreamReader的readline将返回所有内容,直到遇到\ r \ n。由于您计划用“,”替换\ r \ n,您只需将逗号附加到readline返回的字符串即可。

using (StreamWriter sw = new StreamWriter(Path.GetTempFileName()))
{
    using (StreamReader sr = new StreamReader(@"YourFile"))
    {
        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            if (line != null)
            {
                sw.Write(line + ",");
            }
        }
    }
}

如果您计划在代码的其余部分中使用操作文本,那么可以使用StringBuilder构建字符串(将sw.Write替换为sb.Append);但是,使用StringBuilder并不能保证您不会遇到OutOfMemoryException。大字符串是一个大字符串。如果你的字符串没有连续的内存块,那么你将获得OutOfMemoryException。另外,正如@SteveCzetty指出的那样,对string.Replace()的调用会返回字符串的副本。字符串越大,您遇到异常的可能性就越大。