2014-09-16 1 views
0

У меня есть машина с 32 ГБ памяти/Windows Server 64 бит.Ошибка в ReadLine для огромного файла

Файл около 30G, но постоянно растет, так как это файл журнала.

Я получаю исключение из памяти (на ReadLine), но я не понимаю, почему - поскольку я просто читаю «линию» несколько раз. После этого данные НЕ сохраняются.

Работает ли ReadLine так, как я этого не ожидал? Возможно ли, что это действительно чтение всего файла в памяти? Или это как-то результат попытки повторного чтения последней строки - пока ожидаете, что файл журнала будет расти?

EDIT StackTrace как ошибка:

Исключение типа 'System.OutOfMemoryException' был брошен. в System.Text.StringBuilder.ExpandByABlock (Int32 minBlockCharCount) в System.Text.StringBuilder.Append (значение Char *, Int32 valueCount) в System.Text.StringBuilder.Append (значение Char [], Int32 startIndex, Int32 charCount) на System.IO.StreamReader.ReadLine() в FIXFileReader.FIXFileReader.NextIntraMessage (DateTime & sourceDT) в C: \ Проекты \ OrderManager \ OrderManager \ FIXFileReader.cs: линии 116

private string line; 
    private StreamReader; 

//edit to give better picture 

    txtFileReader = new StreamReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); 


while (true) 
{ 

         while ((line = txtFileReader.ReadLine()) == null) 
         { 

          if (!masterForm.FixFileDataLive) 
          { 
           masterForm.FixFileDataLive=true; 
          } 

          System.Threading.Thread.Sleep(1); 

         } 


       // Do processing of line here 
       // < other code >> 
       // 


} 
+1

Рассмотрите возможность замены определения StreamReader командой «[using] (http://msdn.microsoft.com/en-us//library/yh598w02.aspx)» на C#. Также этот вопрос, вероятно, является дубликатом. См. [1] (https://stackoverflow.com/questions/13415916/read-big-txt-file-out-of-memory-exception) [2] (https://stackoverflow.com/questions/12689284/memory -leak-с-StreamReader). Также прочитайте [this] (http://bytes.com/topic/c-sharp/answers/277723-problem-reading-large-text-file). –

+0

Вместо этого вы пытались использовать File.ReadLines? –

+4

Как долго длится «линия»? Вы видите использование памяти, подтверждающее, что вы действительно используете слишком много памяти? –

ответ

2

UPDATE:

Проведенные испытания Текстовый файл 10 ГБ на ноутбуке с 8 ГБ памяти, работает с 0 проблемами памяти. При записи файла LINQPad использовало не более 65 МБ ОЗУ. При чтении файла использовалось не более 800 МБ ОЗУ.

Этот код очень похож на ваш пример.

void Main() 
{ 
    using(StreamWriter writer = new StreamWriter("D:\\Test.txt", true)) 
    { 
     while(true) 
     { 
      writer.WriteLine("Test"); 
     } 
    } 

    // At some point, stop the writing and comment it out and then re-execute with 
    // with the reading code below. I ran the above until I had a 10GB text file.  

    using (TextReader reader = new StreamReader(File.Open("D:\\Test.txt", 
               FileMode.Open, FileAccess.Read, 
               FileShare.ReadWrite))) 
    { 
     while(true) 
     { 
      var line = string.Empty; 
      while((line = reader.ReadLine()) == null) 
      { 
       Console.WriteLine("Waiting...."); 
       Thread.Sleep(500); 
      } 

      Console.WriteLine(line); 
     } 
    } 
} 

Я не думаю, что ваша проблема заключается в чтении файла. Мы не можем точно знать, в чем проблема, без дополнительной информации. Просто отметьте, что вы все равно должны реализовать using, если вы еще этого не сделали, и чтение текстового файла кажется прекрасным.

Ниже оригинальный ответ на исходный вопрос

Надеюсь, это фактический код, который вы вставили и не просто опечатка материал, делая этот вопрос. В противном случае этот ответ бесполезен.

Ваш while Состояние неправильное. Вы хотите работать, пока есть строки для чтения. Вам нужно != null, а не == null.

while ((line = txtFileReader.ReadLine()) != null) 

Если оставить как ==, ваша программа фактически никогда не будет делать ничего. Если, конечно, он не смог прочитать первую строку, которая затем вызовет бесконечный цикл. Возможно, проблема с вашей памятью связана с кодом, прошедшим эту часть.

Вы также должны обернуть свой txtFileReader в операторе using, чтобы он мог правильно закрыть поток, когда вы закончите.

+0

Нет - я действительно хочу == null, вот где я жду, когда файл получит больше данных. Я редактировал свой код, чтобы дать более полную идею. Я могу взять только фрагмент из большого приложения. – ManInMoon

+0

@ManInMoon Теперь, когда показано, что это находится в другом основном цикле while, обязательно переносите его в оператор using. Но все же мы не можем вам помочь, если мы не знаем, что он делает, когда строка найдена. Все, что я вижу, это то, что вы устанавливаете строку, делаете что-то, а затем сразу открываете файл ... это плохо. – TyCobb

+0

Я НЕ открываю файл снова! Он остается открытым все время, а затем я жду добавления новых данных. – ManInMoon

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

  • Нет связанных вопросов^_^