簡體   English   中英

處理System.OutOfMemoryException

[英]Handling System.OutOfMemoryException

給出以下代碼:

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

我會補充

streamReader.Dispose();

在sLine = streamReader.ReadToEnd();之后 這將在啟動替換過程之前釋放一些內存。

我同意先前的評論,您應該分塊讀取文件,但是如果必須立即將整個塊讀入內存:

String.Replace()是返回字符串的副本 ,因此在替換之后,您使用的內存是以前的兩倍。 嘗試改用StringBuilder.Replace(),或者如果確實需要RAM,請將字符串加載到字節數組中並內聯處理字符串。 (但是,由於您要用兩個字符替換一個字符,所以會帶來一些問題。)

我將考慮一下並重新審視它。

一旦完成操作,您打算如何處理更改后的字符串? 如果您只是要將其寫入文件,那么也許您應該一次讀取一行,執行操作,然后將更改后的行寫入文件。 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構建字符串(用sb.Append替換sw.Write); 但是,使用StringBuilder不能保證您不會遇到OutOfMemoryException。 大字符串是大字符串。 如果您的字符串沒有連續的內存塊,那么您將獲得OutOfMemoryException。 另外,正如@SteveCzetty指出的那樣,您對string.Replace()的調用將返回您的字符串的副本。 字符串越大,越有可能遇到異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM