У меня есть приложение winforms для C#, в котором я использую OpenFileDialogOpenFileDialog, чтобы пользователи могли выбирать текстовые файлы для открытия. (Разрешено множественное выделение) Как только они выбирают текстовые файлы, я откройте файлы один за другим, получите текст и сохраните содержимое в переменной List с помощью операции List.Add().Исключение из памяти Исключение при обработке больших файлов в C#
Моя проблема возникает, когда пользователь выбирает необычно большое количество текстовых файлов, таких как 1264 текстовых файлов общим размером до 750 МБ, программа не может его обработать. Он считывает до 850 файлов, а затем дает мне исключение из памяти. В диспетчере задач память моего приложения (частный рабочий набор) составляет около 1,5 ГБ, когда это происходит. Я использую машину x64 с 32 ГБ оперативной памяти.
Я даю код, который считывает через файлы:
public static List<LoadData> LoadDataFromFile(string[] filenames)
{
List<LoadData> MasterData = new List<LoadData>();
lookingForJobs = new LookingForJobs(1,filenames.Length);
lookingForJobs.Show();
/*-------OUTER LOOP TO GO THROUGH ALL THE FILES-------*/
for (int index = 0; index < filenames.Length; index++)
{
string path = filenames[index];
/*----------INNER LOOP TO GO THROUGH THE CONTENTS OF EACH FILE------*/
foreach (string line in File.ReadAllLines(path))
{
string[] columns = line.Split('\t');
if (columns.Length == 9)
{
if (line.StartsWith("<")) /*-------IGNORING THE FIRST 8 LINES OF EACH LOG FILE CONTAINING THE LOGGER INFO---------*/
{
MasterData.Add(new LoadData
{
Event_Type = columns[0],
Timestamp = columns[1],
Log_Message = columns[2],
Category = columns[3],
User = columns[4],
Thread_ID = columns[5],
Error_Code = columns[6],
Application = columns[7],
Machine = columns[8]
});
}
}
}
lookingForJobs.SearchingForJobsProgress.PerformStep();
/*--------END OF INNER LOOP--------*/
}
lookingForJobs.Dispose();
/*-----------END OF OUTER LOOP-----*/
return MasterData;
}
Edit: Я понимаю, что я должен возможно переделать мой код так, что не все файлы считываются в объект сразу. Но я хочу знать, есть ли ограничение на размер объекта списка или памяти (частный рабочий набор). Я читал в нескольких статьях, что когда вы попадаете в 1,5-1,6 ГБ, эти проблемы возникают.
Вы строите приложение в режиме x64? – Guffa
@ Guffa добавляет память до тех пор, пока не всплески не обязательно * правое «исправить» здесь, особенно когда потоковый (вместо буферизованного) подход настолько тривиален (см. Ответ Konrad) –
Вы уверены, что вам нужны все эти данные в памяти однажды ... ? –