Потребление памяти EF - PullRequest
2 голосов
/ 19 мая 2009

Доброе утро!

На самом деле я немного поиграюсь с EF atm и мне нужна помощь ваших парней:
Следующий сценарий: у меня есть таблица с большим количеством данных в нем. Если я запрашиваю эту таблицу через EF, все записи загружаются в память.

например.

var counter = default(int);
using (var myEntities = new MyEntities())
{
    foreach (var record in myEntities.MySpecialTable)
    {
        counter++;
    }
}

Итак, я просматриваю все записи MySpecialTable и считаю counter. Когда я смотрю на Taskmanager или что-то еще, что показывает потребление памяти моим приложением, оно говорит мне: 400Mb. (из-за данных)
Если я в следующий раз выполню таблицу, потребление памяти увеличится вдвое.

Я уже пытался позвонить в GC, но это не сработает.

Почему все записи каждого прогона хранятся где-то в памяти (и не освобождаются)? Где они хранятся? Есть ли способ заставить EF-запросы вести себя как DataReader? Или есть какой-нибудь другой ORM, такой же элегантный, как EF?

редактирование:
нет, я не делаю такой подсчет ... это просто для показа итерации:)

1 Ответ

1 голос
/ 19 мая 2009

Прежде всего, я надеюсь, что вы на самом деле не ведете такой подсчет; метод подсчета намного эффективнее. Но предположим, что это просто демонстрационный код для отображения проблемы с памятью:

Измените свойство MergeOption для ObjectQuery на NoTracking . Это говорит Entity Framework, что вы не собираетесь изменять сущности, и, следовательно, нет необходимости отслеживать их исходное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...