对于我的项目,我需要从日志文件中提取消息类型。我有一个700 MB的日志文件,其中包含大约470万行,我需要逐行读取每个条目并提取消息字段。我需要在每个条目中找到消息的大小(这是事件大小)并将其与该消息一起存储在字典中。同一事件大小可能有多条消息。但是当我使用下面的逻辑时,我得到一个OutOfMemoryException。
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 :(得分: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);
}
}