2017-01-05 2 views
0

Я использую log4net с memoryappender. Когда я пытаюсь прочитать все строки переменной (здесь: StringBuilder), я получаю OutOfMemory-Exception, когда количество строк должно быть высоким. Я тестировал его с 1mio линиями:log4net memoryappender Недостаточно памяти

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()); 
    } 
} 

, когда я просто добавить один миллион линий к StringBuilder без log4net компонент все прекрасно работает ...

Я также попытался использовать это:

var stringBuilder = new StringBuilder(); 
var stringWriter = new StringWriter(stringBuilder); 

foreach (var loggingEvent in GetEvents()) 
{ 
    stringBuilder.Clear(); 
    loggingEvent.WriteRenderedMessage(stringWriter); 

    list.Add(stringBuilder.ToString()); 
} 

но это также не сработало.

+1

Возможный дубликат [StringBuilder.ToString() выдает исключение OutOfMemory] (http://stackoverflow.com/questions/25010604/stringbuilder-tostring-throws-outofmemory-exception) – raven

ответ

0

Если вы хотите, чтобы в памяти было много строк, среда выполнения хочет выделить часть памяти, которая может содержать всю строку. Если это невозможно, потому что в этот момент вызывается исключение OutOfMemory. Если вам нужны байты из memystream, более эффективно вызывать метод ToArray() в memystream, который также может завершиться ошибкой по той же причине, что и метод ToString сбой в StringBuilder. Вы можете проверить, запускаете ли вы 64-битный режим, если нет, это может помочь получить больше адресного пространства. Я бы посоветовал пересмотреть метод ведения журнала. То, как вы делаете это сейчас, является ненадежным и даже может сломать вашу программу.

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