#c_sharp
Здравствуйте!
Подскажите как правильно очистить всю занятую память в IEnumerable
Собираю файлы с директории в другую папку, вначале проходит долго, после 2 запуска
файлы быстро появляются собранные из памяти.
Код:
public static void Viscan(string ss, string[] Format, string z)
{
long Limit = 100000000;
long LowLimit = 0;
IEnumerable findFiles = Directory.GetFiles(ss, "*.*", System.IO.SearchOption.AllDirectories);
if (Directory.Exists(z))
foreach (string fileName in findFiles)
{
string ext = Path.GetExtension(fileName).ToLower();
if (Array.IndexOf(Format, ext) < 0) continue;
try
{
var fileSize = new FileInfo(fileName).Length;
if (LowLimit + fileSize > Limit) continue;
File.Copy(fileName, Path.Combine(z, Path.GetFileName(fileName)), true);
LowLimit += fileSize;
}
catch { }
}
}
Ответы
Ответ 1
IEnumerablefindFiles = Directory.GetFiles(ss, "*.*", System.IO.SearchOption.AllDirectories); Здесь вы определяете переменную ссылочного типа IEnumerable с именем findFiles, которая в результате присваивания ссылается на объект в куче, являющийся массивом строковых переменных. Данные хранятся в управляемой куче. Переменная объявлена внутри метода, следовательно, после того, как метод отработает, ссылки на объект в управляемой куче уже не будет. Поэтому после того, как CLR сама в нужный момент вызовет Garbage Collector (сборщик мусора), памать, выделенная под вашу переменную сама освободится. Ответ 2
Вы имеете ввиду что первые два запуска файлы медленно копируются, а потом быстро? Если так, то тут имеет место быть работа менеджера памяти Windows, который просто держит часто используемые файлы отображенными в память, и следовательно фактически доступ к ним мгновенный. А по поводу очистки памяти занятой перечислимым типом, короткий ответ - прямым способом никак, т.к. всем этим занимается GC (garbage collector). Конечно можно им и руками порулить вызывая GC.Collect, но зачем? Дело то не в этом.
Комментариев нет:
Отправить комментарий