【问题标题】:Handling System.OutOfMemoryException处理 System.OutOfMemoryException
【发布时间】:2012-02-15 16:26:42
【问题描述】:

鉴于此代码:

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

【问题讨论】:

  • 尝试捕获?说真的,只是分块阅读。不要一次把它全部放在内存中。
  • 哪个like会导致异常? ReadToEnd?
  • 问题出现时sLine有多大?
  • 请勿转发问题。问一次问题,如果您被否决,请解决问题,不要再次发布。
  • 我删除了原始(已关闭)问题并清除了对此问题的关闭投票。一个问题只需要一份副本。

标签: c# asp.net .net


【解决方案1】:

在您完成操作后,您打算如何处理更改后的字符串?如果您只是要将其写入文件,那么也许您应该一次读取一行,执行您的操作,然后将更改的行写入文件。 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() 的调用会返回您的字符串的副本。字符串越大,您遇到异常的可能性就越大。

【讨论】:

    【解决方案2】:

    我会补充

    streamReader.Dispose();
    

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

    【讨论】:

      【解决方案3】:

      我同意之前的 cmets 应该分块读取文件,但如果必须一次将整个块读入内存:

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

      我会考虑并重新考虑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-11
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多