Использует ли структура сущностей мою память? - PullRequest
1 голос
/ 21 октября 2010

Я пытаюсь понять, почему использование памяти в основном приложении, которое я пишу, чрезмерно. Я пытаюсь создать динамическую карту сайта MVC с примерно 25000 узлов и заполнить ее из таблицы базы данных, используя структуру сущностей (хотя эта деталь, вероятно, не важна)

У меня есть следующий код:

foreach (var c in context.Companies) { }

С точкой останова перед этой строкой webdev.webserver40.exe потребляет около 50 Мб. Потом около 250мб. Я попытался избавиться от контекста, чтобы контекст выпал из области видимости; каждый раз вызывая GC.Collect (), но я не могу восстановить эту память.

NB. Я знаю, что память не обязательна и обычно не освобождается сразу, я просто хочу успокоиться, что здесь нет утечки памяти.

Спасибо

Ответы [ 2 ]

1 голос
/ 19 марта 2012

У меня похожая ситуация с почти таким же кодом, за исключением того, что мой контекст - это контекст Entity Framework, а данные поступают из базы данных. Похоже, что это «всплеск использования памяти», а не постоянная «утечка», поскольку общее потребление памяти процессом в конечном итоге возвращается к разумному нормальному уровню. Это все еще не очень хорошая вещь.

Похоже, что он загружает в память все данные столбца, включая данные большого двоичного столбца в моем случае. Данные сохраняются до тех пор, пока «область» не заканчивается (например, содержимое выходит за пределы области). Во время зацикливания некоторые данные выживают при сборе мусора и переходят в следующее поколение, что приводит к увеличению срока хранения (в моем случае память освобождается примерно через 10 минут).

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

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

В вашей карте сайта, возможно, вы можете "сегментировать" вид и загрузить только подмножество узлов.

0 голосов
/ 21 октября 2010

Почему бы не запустить один из имеющихся в продаже профилировщиков памяти (у всех есть бесплатные пробные версии), например MemProfiler , сравнить 2 снимка и посмотреть, куда уходит ваша память.

Не видя ваш код, трудно сказать, есть ли у вас утечка памяти.

...