2014-11-19 4 views
0

При подготовке большого количества (нескольких тысяч строк) данных и вставки их в базу данных через Entity Framework, создание объектов Entity или графических объектов в памяти не занимает столько памяти, но когда метод SaveChanges() вызывается, в течение продолжительности он продолжает потреблять заметный объем памяти до тех пор, пока метод не вернется.Почему метод SaveChanges занимает память?

Что именно происходит под капотом в течение периода вызова SaveChanges(), вызывающего это потребление памяти?

ответ

1

Это зависит от глубины вашего графа объекта, чем глубже график, тем больше памяти будет потреблено. Как правило, более дорогостоящие операции, которые происходят после того, как вы называете SaveChanges являются следующими:

  • просмотров генерируются для запросов: Перед EF может выполнить запрос к модели, он должен генерировать аа набора локальных представления запросов для получения доступа к база данных. Чем сложнее ваш графический объект, тем сложнее будут представления, хотя они могут быть предварительно сгенерированы для повышения производительности.
  • Подготовлены запросы: EF создает команды запроса, генерирует деревья команд на основе метаданных и т. Д. И снова стоимость возрастает с увеличением сложности запросов.

Стоимость фактического выполнения запросов относительно невелика. См. here для получения дополнительной информации.

В целом рекомендуется использовать специальные стратегии для массового вставки с EF. См. here.

+0

Спасибо за ваш ответ. +1 Мне очень нравится ваш ID;) и ссылки были также полезны. Эти две точки, на которые вы сосредоточились, похоже, что они стоят скорее времени выполнения, чем памяти (хотя я еще не изучил первую ссылку, хотя). Но так или иначе, какая бы память она ни расходовала, нужно освободить после того, как контекст будет настроен, правильно? Я спрашиваю, потому что в одном из моих сценариев этого не происходит. Я отправлю еще один вопрос по этому поводу. – atiyar