У меня есть некоторые опасения по поводу того, что мой проект использует много памяти. Я настроил свой проект 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; }
}
Следует учитывать две вещи:
Теперь, когда я добавляю вызов к своему методу, чтобы просто получить данные:
var emails = _dbEmailService.GetAllEmails().AsQueryable();
Мое использование памяти увеличивается до 2 ГБ ... затем каждый раз, когда я обновляю его, добавляет еще 1 гиг.
Это действительно плохо, не правда ли? Могу я получить помощь, чтобы понять, почему? Я потратил на это 1,5 дня и очень расстроился. Спасибо.
зачем загружаешь 200000 записей ??? почему вы не используете пейджинг?
И ваше приложение или ваш (ms) экземпляр sql потребляет столько памяти?
.InstancePerLifetimeScope() вызывает проблему здесь
Спасибо всем за ваши быстрые ответы.
Стефан, переменная электронной почты устанавливается в контроллере индекса, который позже загрузит представление. И нет, это всего лишь один звонок, просто для проверки. Я им даже не пользуюсь. Просто пытаюсь сузить проблему. Кроме того, это то, чего не могу понять. Я вижу использование памяти в окне диагностики Visual Studio.
Хани, так что в конечном итоге намерение состоит в том, чтобы использовать подкачку. Я экспериментирую с компонентами DevExpress, и у них есть метод под названием BindToEF, который будет выполнять разбиение по страницам, если вы дадите ему метод Queryable. Документ - здесь.
amd, я изначально использовал InstancePerRequest. Однако мне нужно инициализировать планировщик Quartz, поэтому я не смогу это сделать. После просмотра документа Autofac кажется, что можно отключить его и использовать InstancePerLifeTimeScope. См. здесь.





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