2015-04-15 2 views
0

Я пытаюсь разобрать большой 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 символов.

+1

Вы хранения этих строк массивов в другом месте, которое не является локальной переменной? –

+0

Что делает '// Обработка моего массива с этими строками? – spender

+4

У вас достаточно памяти? Если да, то почему сборщик мусора активируется? –

ответ

2

Это происходит потому, что сбор мусора в .NET, по дизайну, происходит только после факта. Сбор мусора освобождает память, но это связано с затратами на процессорное время. Поэтому не всегда возможно собрать ранний аванс, особенно если память в то время не пользуется большим спросом. В конечном итоге .NET решает это.

Вы можете, тем не менее, вызвать вызов, чтобы вызвать сбор мусора немедленно, например.

GC.Collect();

Это, как правило, не рекомендуется, хотя.

Найти больше информации здесь:

GC.Collect (MSDN)

When is it acceptable to call GC.Collect?

+0

Предполагая, что OP принимает снимки, .NetMemoryProfiler заставляет коллекцию перед измерением – spender

+0

Спасибо, но я смотрю на память, полученную моим приложением после того, как процесс завершен, поэтому GC, похоже, уже собрал все. Я попытался заставить его использовать 'GC.Collect()', но результат был тот же. – SeyoS

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