Огромное потребление памяти (MVC 5 + EntityFramework 6.2.0) - PullRequest
0 голосов
/ 07 июня 2018

У меня есть некоторые опасения по поводу моего проекта, использующего много памяти.Я настроил свой проект 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 с помощью 200 000 записей указанного выше Email
  • В поле Subject каждой записи устанавливается строка длиной 2500 символов

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

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

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

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

1 Ответ

0 голосов
/ 08 июня 2018

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

...