Я написал приложение c # win, которое позволяет пользователю открывать файл журнала (текст) и просматривать строки журнала в сетке данных. Форматы приложения, которые регистрируют данные, чтобы пользователь мог фильтровать, искать и т. Д.
У меня проблема в том, что когда пользователь открывает файл журнала> 300 МБ, приложение выдает исключение нехватки памяти.
Приложение сначала загружает все строки журнала в массив строк, а затем циклически перебирает строки журнала, добавляя объекты записи журнала в список.
var allLogLines = File.ReadAllLines(logPath).ToList();
var nonNullLogLines = allLogLines.Where(l => !string.IsNullOrEmpty(l));
this.ParseLogEntries(nonNullLogLines.ToArray());
Этот начальный шаг (загрузка данных журнала в массив строк) занимает около 1 ГБ памяти в диспетчере задач.
internal override void ParseLogEntries(string[] logLines)
{
this.LogEntries = new List<LogEntry>();
this.LogLinesCount = logLines.Count();
for (int i = 0; i < this.LogLinesCount; i++)
{
int entryStart = this.FindMessageCompartment(logLines, i);
int entryEnd = this.FindMessageCompartment(logLines, entryStart + 1);
int entryLength = (entryEnd - entryStart) + 1;
if (entryStart + entryLength > this.LogLinesCount)
{
entryLength = this.LogLinesCount - entryStart;
}
var logSection = new string[entryLength];
Array.Copy(logLines, entryStart, logSection, 0, entryLength);
Array.Clear(logLines, i, entryLength - 1);
this.AddLogEntry(logSection);
i = (entryEnd - 1);
}
}
Метод AddLogEntry добавляет запись журнала в список (LogEntries). Циклу for удается проанализировать около 50% файла журнала, после чего возникает исключение нехватки памяти. В этот момент диспетчер задач сообщает, что приложение использует около 1,3 ГБ памяти.
Как вы можете видеть выше, я добавил Array.Clear, чтобы обнулить часть данных журнала, которые были успешно проанализированы, в результате я ожидаю, что, когда объекты добавляются в коллекцию, объем памяти ( 1 Гб для начала), используемый большим массивом данных журнала, будет неуклонно сокращаться, но это не так. фактически эта строка не имеет никакого значения для использования памяти, даже если я периодически добавляю сборщик мусора.
Прочитав о LOH, я предполагаю, что это потому, что куча не сжимается, поскольку части большого массива обнуляются, поэтому он всегда использует один и тот же 1 ГБ памяти, несмотря на свое содержимое.
Можно ли каким-либо образом уменьшить объем памяти, удерживаемой во время анализа данных, или возможную переработку, которая может более эффективно использовать память? Мне кажется странным, что текстовый файл размером 300 МБ, помещенный в строковый массив, потребляет 1 ГБ памяти?
Спасибо.