Как очистить IEnumerable

252
15 марта 2017, 15:32

Здравствуйте!

Подскажите как правильно очистить всю занятую память в IEnumerable

Собираю файлы с директории в другую папку, вначале проходит долго, после 2 запуска файлы быстро появляются собранные из памяти.

Код:

 public static void Viscan(string ss, string[] Format, string z)
{
    long Limit = 100000000;
    long LowLimit = 0;
    IEnumerable<string> 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 { }
        }
}
Answer 1
IEnumerable<string> findFiles = Directory.GetFiles(ss, "*.*", System.IO.SearchOption.AllDirectories);

Здесь вы определяете переменную ссылочного типа IEnumerable<string> с именем findFiles, которая в результате присваивания ссылается на объект в куче, являющийся массивом строковых переменных. Данные хранятся в управляемой куче. Переменная объявлена внутри метода, следовательно, после того, как метод отработает, ссылки на объект в управляемой куче уже не будет. Поэтому после того, как CLR сама в нужный момент вызовет Garbage Collector (сборщик мусора), памать, выделенная под вашу переменную сама освободится.

Answer 2

Вы имеете ввиду что первые два запуска файлы медленно копируются, а потом быстро? Если так, то тут имеет место быть работа менеджера памяти Windows, который просто держит часто используемые файлы отображенными в память, и следовательно фактически доступ к ним мгновенный.

А по поводу очистки памяти занятой перечислимым типом, короткий ответ - прямым способом никак, т.к. всем этим занимается GC (garbage collector). Конечно можно им и руками порулить вызывая GC.Collect, но зачем? Дело то не в этом.

READ ALSO
Как вывести таблицу из БД?

Как вывести таблицу из БД?

Всем доброго времени сутокХочу вывести таблицу из бд в таблицу на странице,как можно это сделать? в то уже всю голову сломал

279
Установка куки для других сайтов

Установка куки для других сайтов

По адресу bdkurs/dick есть indexphp файл в котором устанавливаю куки

222
Не работает mcrypt_module на локалке

Не работает mcrypt_module на локалке

Вот такая ошибка вылетает

193