Управление памятью в C # .NET с помощью структур данных (словарь, список и т. Д.) - PullRequest
1 голос
/ 11 марта 2011

Я надеюсь, что кто-то может пролить некоторый свет на то, как .NET обрабатывает сборку мусора в следующем случае.

У меня есть программа, в которой мне нужно выполнить очень специфическую функцию "Поиск в файлах".как вы могли бы видеть в Visual Studio.Мне нужно искать потенциально тысячи файлов, и я собираю результаты в объекте List (Pair ()), где Pair - это простой класс, который я создал для хранения пары элементов (очевидно).

Когда яиспользуя то, что мне нужно, я вызываю Clear () в списке, чтобы избавиться от старой информации.Похоже, это не помогает освободить память, потому что в диспетчере задач видно, что объем используемой памяти не уменьшается.

При действительно большом поиске я потенциально имею дело с 5 000 000 строк информации (примерно 500 МБиспользование памяти на моей машине), которые должны быть обработаны.Когда мой поиск закончен, уровень потребляемой памяти остается прежним.Я сделал в своем классе Pair реализацию IDisposable, и это не помогло.

Есть идеи, чего мне не хватает?Спасибо!

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

Сборка мусора очистит память, когда понадобится , то есть не когда вы «очистите» список, а когда обнаружит, что ни на один из элементов, на которые есть ссылки в нем, больше нет ссылок икогда процессу / компьютеру не хватает памяти.

Нет необходимости в микроуправлении памятью в C #.

3 голосов
/ 11 марта 2011

Сборщик мусора .NET удивительно хорош. В общем, вам не следует беспокоиться об использовании памяти, которое вы видите в диспетчере задач, потому что, как вы наблюдаете, сборщик мусора не освобождает память, как вы думаете. Причиной этого является восстановление памяти - дорогостоящая операция. Если память не нужна в этот момент, зачем возиться там? Внутренняя работа того, когда это действительно идет, исправляя пространство, довольно вовлечена. Существуют различные уровни сбора, которые проходит GC (называемые поколениями) для восстановления памяти, оптимизированной для скорости.

Есть много статей, которые могут объяснить это более подробно, чем я. Вот отправная точка.

http://msdn.microsoft.com/en-us/library/ms973837.aspx

А пока вы должны увидеть, в какой момент у вас закончится исключение из памяти, если оно вообще есть, и идти оттуда.

1 голос
/ 11 марта 2011

Когда вы вызываете Clear(), все ссылки на объекты Pair будут удалены, это приведет к тому, что эти объекты будут GC'ed , в конечном итоге , если только другой объект не содержит ссылки на них, но вы не можете сосчитатькогда это произойдет - это также зависит от нагрузки на память.

В качестве примечания можно использовать Tuple в C # 4 вместо Pair.

...