2013-09-08 4 views
2

Для моего проекта мне нужно извлечь типы сообщений из файла журнала. У меня есть файл журнала 700 МБ, который содержит около 4.7 миллионов строк, и мне нужно прочитать каждую строку строки и извлечь поле сообщения. Мне нужно найти размер сообщения в каждой записи (это размер события) и сохранить его вместе с этим сообщением в словаре. Для одного и того же размера события может быть несколько сообщений. Но я получаю исключение OutOfMemoryException, когда использую приведенную ниже логику.Чтение большого файла журнала в C#

Dictionary<Int32,List<String>> dt=new Dictionary<Int32,List<String>>(); 
List<String> entries=new List<String>(); 
StreamReader sr=new StreamReader("Bluegene.log"); 
String s; 
while((s=sr.readLine())!=null) 
{ 
    eventsize=s.length - 9; //size of only the message field 
    entries.Add(s); 
    if (!dt.ContainsKey(eventsize)) 
    { 
     dt.Add(eventsize, entries); 
    } 
    else 
    { 
     dt.Remove(eventsize); 
     dt.Add(eventsize, entries); 
    } 
    } 

Будет ли использовать функцию MemoryMappedFile?

+0

Как вы получить доступ к данным? Вам нужно вывести все события с определенным размером и работать над ними на основе этого? – dcaswell

+0

Каждый раз, когда вы добавляете запись, вы добавляете все предыдущие записи в список, это необходимо? – usercr

+0

@ user814064 У меня есть необработанный файл журнала (.log) со мной. Я хочу прочитать его по строкам и сформировать разделы сообщений с одинаковым размером. – Sridhar

ответ

2

Проблема в том, что ваш список постоянно растет.
Таким образом, вы можете попробовать следующее:

Dictionary<Int32, List<String>> dt = new Dictionary<Int32, List<String>>();   
      int eventsize; 
      StreamReader sr = new StreamReader("Bluegene.log");   
      string s; 
      while ((s = sr.ReadLine()) != null) 
      { 
       eventsize = s.Length - 9; //size of only the message field  
       if (!dt.ContainsKey(eventsize)) 
       { 
        List<String> entries = new List<String>(); 
        entries.Add(s); 
        dt.Add(eventsize, entries); 
       } 
       else 
       { 
        dt[eventsize].Add(s); 
       } 
      } 
+0

Спасибо за это! Это была глупая ошибка. – Sridhar

+0

Спасибо Уважаемый разработчик :) –

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