Я пытаюсь разобрать большой CSV-файл. Для этого я запускаю свою функцию в новом потоке, и я делаю это:Строки String.Split не собираются сборщиком мусора
using (StreamReader sr = new StreamReader(CurrentFilePath, Encoding.UTF8))
{
while (!sr.EndOfStream)
{
String strLine = sr.ReadLine();
String[] strFields = strLine.Split('\t');
//Processing my array
}
}
Здесь нет ничего необычного. Но я заметил, что каждая приватная строка, созданная String.Split
, хранится в памяти. Так что, когда я разбираю файл с X-строками в столбцах Y, у меня есть почти X * Y строка все еще в памяти (используя .NetMemoryProfiler, который также говорит, что они не были собраны GC).
Это потому, что это запуск в другой теме? Есть идеи ?
- EDIT - Я хранящий 20 из 31 столбцов моего CSV в этом классе:
class InputEntry {
public String Field1 {get;set;}
public String Field2 {get;set;}
public String Field2 {get;set;}
...
}
Если я загрузить файл 216Mo (31 столбцов на 288000 строк), когда я храню каждая строка в списке моего класса InputEntry
, она принимает 450Mo в памяти, даже если средняя длина строки составляет 37 символов.
Вы хранения этих строк массивов в другом месте, которое не является локальной переменной? –
Что делает '// Обработка моего массива с этими строками? – spender
У вас достаточно памяти? Если да, то почему сборщик мусора активируется? –