Огромное потребление памяти (MVC 5 + EntityFramework 6.2.0)

У меня есть некоторые опасения по поводу того, что мой проект использует много памяти. Я настроил свой проект MVC 5 с помощью Entity Framework. Еще я использую Autofac.

Я нахожу свои классы репозитория и классы обслуживания (которые находятся в одном проекте), выполнив:

builder.RegisterAssemblyTypes(typeof(PlanRepository).Assembly)
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces().InstancePerLifetimeScope();

(И еще один аналогичный для услуг в этом проекте.)

Теперь при отладке я вижу, что инициализирую свой _dbContext, если это еще не сделано, и в конце я вижу, что удаление выполняется успешно. При запуске страницы использование памяти составляет около 460 мегабайт, и если я продолжаю обновлять, оно немного увеличивается и достигает 500 мегабайт, а когда я останавливаюсь через 10-15 минут, оно падает примерно до 460 мегабайт.

Теперь я хотел что-то протестировать, поэтому создал DBSet, используя следующую модель:

    public class Email
    {
       public int ID { get; set; }
       public string Subject { get; set; }
       *[StringLength(32, ErrorMessage = "Must be under 32 characters")]*
       public string From { get; set; }
       public DateTime Sent { get; set; }
       public long Size { get; set; }
       public Boolean HasAttachment { get; set; }
     }

Следует учитывать две вещи:

  • Я загрузил DBSet с помощью 200000 записей из указанного выше электронного письма.
  • В поле Предмет каждой записи устанавливается строка длиной 2500 символов.

Теперь, когда я добавляю вызов к своему методу, чтобы просто получить данные:

var emails = _dbEmailService.GetAllEmails().AsQueryable();

Мое использование памяти увеличивается до 2 ГБ ... затем каждый раз, когда я обновляю его, добавляет еще 1 гиг.

Это действительно плохо, не правда ли? Могу я получить помощь, чтобы понять, почему? Я потратил на это 1,5 дня и очень расстроился. Спасибо.

Где живет этот var emails? И храните ли вы эту информацию где-нибудь, возможно, в статическом списке?

Stefan 07.06.2018 13:24

зачем загружаешь 200000 записей ??? почему вы не используете пейджинг?

Hany Habib 07.06.2018 13:26

И ваше приложение или ваш (ms) экземпляр sql потребляет столько памяти?

Stefan 07.06.2018 13:31
.InstancePerLifetimeScope() вызывает проблему здесь
amd 07.06.2018 13:43

Спасибо всем за ваши быстрые ответы.

user9647280 07.06.2018 13:49

Стефан, переменная электронной почты устанавливается в контроллере индекса, который позже загрузит представление. И нет, это всего лишь один звонок, просто для проверки. Я им даже не пользуюсь. Просто пытаюсь сузить проблему. Кроме того, это то, чего не могу понять. Я вижу использование памяти в окне диагностики Visual Studio.

user9647280 07.06.2018 13:50

Хани, так что в конечном итоге намерение состоит в том, чтобы использовать подкачку. Я экспериментирую с компонентами DevExpress, и у них есть метод под названием BindToEF, который будет выполнять разбиение по страницам, если вы дадите ему метод Queryable. Документ - здесь.

user9647280 07.06.2018 13:50

amd, я изначально использовал InstancePerRequest. Однако мне нужно инициализировать планировщик Quartz, поэтому я не смогу это сделать. После просмотра документа Autofac кажется, что можно отключить его и использовать InstancePerLifeTimeScope. См. здесь.

user9647280 07.06.2018 13:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо всем за помощь. Ваш вопрос заставил меня вернуться и пересмотреть свой подход к разбиению на страницы. Первоначально у меня возникала та же проблема с разбиением на страницы, и поэтому я начал пытаться получить все записи, чтобы увидеть, где находится узкое место. Но теперь, присмотревшись, я заметил, что пейджинг на самом деле не работает, потому что моя Lambda извлекала все записи, а не только IQueryable. Затем возникла вторая проблема, когда запрос к БД занимал 3 секунды. Это произошло из-за отсутствия индекса в столбце идентификатора. Как только я его добавил, все начало работать как надо, с небольшим объемом памяти и очень быстро. Несколько часов перерыва от экрана могут сделать это потрясающе. :)

Другие вопросы по теме