我使用log4net和memoryappender。 当我尝试读取变量的所有行(这里:StringBuilder)时,当行数量很高时,我得到一个OutOfMemory-Exception。我用1mio线测试了它:
public class RenderingMemoryAppender : MemoryAppender
{
public IEnumerable<string> GetRenderedEvents(List<Level> levelList = null)
{
foreach (var loggingEvent in GetEvents())
{
yield return RenderLoggingEvent(loggingEvent);
}
}
public byte[] GetEventsAsByteArray(List<Level> levelList=null )
{
var events = GetRenderedEvents(levelList);
var s = new StringBuilder();
foreach (var e in events)
{
s.Append(e);
}
//the exception is thrown here below when calling s.ToString().
return Encoding.UTF8.GetBytes(s.ToString());
}
}
当我简单地将一百万行添加到没有log4net组件的stringbuilder时,一切正常......
我也尝试过这个:
var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);
foreach (var loggingEvent in GetEvents())
{
stringBuilder.Clear();
loggingEvent.WriteRenderedMessage(stringWriter);
list.Add(stringBuilder.ToString());
}
但这也没有用。
答案 0 :(得分:0)
如果你想在内存中包含那么多行,运行时想要分配一段可以包含整个字符串的内存。如果不可能,因为在那一刻,抛出了OutOfMemory异常。如果你需要来自内存流的字节,那么在内存流上调用ToArray()方法会更有效,这也会因为ToString方法在StringBuilder上失败的原因而失败。您可以检查是否以64位模式运行,如果没有,它可以帮助获得更多的地址空间。我建议重新考虑你的日志记录方法。你现在这样做的方式是不可靠的,甚至可能会破坏你的程序。