2012-02-15 3 views
0

Учитывая этот код: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?

+6

С попыткой поймать? Серьезно, хотя, просто прочитайте его в кусках. Не помещайте все это в память сразу. – jadarnel27

+0

Какой вид вызывает исключение? ReadToEnd? –

+0

получение ошибки в этой строке sLine = (sLine.Contains (","))? sLine.Replace (",", "\ r \ n"): sLine; –

ответ

0

Я хотел бы добавить

streamReader.Dispose(); 

после Sline = streamReader.ReadToEnd(); это освободит память, прежде чем вы начнете процесс замены.

0

Я согласен с предыдущими комментариями, которые вы должны прочитать файл в кусках, но если вы должны прочитать весь кусок в память сразу:

string.replace() возвращает это копию строки, поэтому после замены вы используете вдвое больше памяти, чем раньше. Попробуйте вместо этого использовать StringBuilder.Replace(), или если вы действительно нажали на ОЗУ, загрузите строку в массив байтов и манипулируйте строкой inline. (Хотя, поскольку вы заменяете один символ на два, это создает некоторые проблемы.)

Я собираюсь подумать об этом и пересмотреть это.

0

Что вы планируете делать с измененной строкой, когда закончите с вашими манипуляциями? Если вы просто собираетесь записать его в файл, то, возможно, вам следует прочитать по одной строке за раз, выполнить свою манипуляцию, а затем записать измененную строку в файл. Считывающая строка StreamReader вернет все, пока не встретится с \ 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() возвращают копию вашей строки. Чем больше строка, тем больше вероятность того, что вы столкнетесь с исключением.

Смежные вопросы