Использует ли структура сущности мою память?

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

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

foreach (var c in context.Companies) { }

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

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

Спасибо


person Martin Booth    schedule 21.10.2010    source источник


Ответы (2)


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

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

person Mitch Wheat    schedule 21.10.2010

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

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

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

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

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

person Yoshi    schedule 19.03.2012