EF4: объектный контекст потребляет слишком много памяти - PullRequest
1 голос
/ 17 ноября 2010

У меня есть инструмент отчетности, который работает на MS SQL Server с использованием EF4. Основная часть этого отчета включает в себя циклическое построение более 5000 строк и последующее извлечение множества других строк для каждой из них. Я вытягиваю начальные строки через один контекст данных. Код, который извлекает связанные строки, включает использование другого контекста данных, заключенного в оператор using. Однако может показаться, что память, используемая вторым контекстом данных, никогда не освобождается, и ее использование увеличивается до 1,5 ГБ, прежде чем выдается исключение нехватки памяти.

Вот фрагмент кода, чтобы вы могли понять:

var outlets = (from o in db.tblOutlets
                       where o.OutletType == 3
                       && o.tblCalls.Count() > number && o.BelongsToUser.HasValue  && o.tblUser.Active == true
                       select new { outlet = o, callcount = o.tblCalls.Count() }).OrderByDescending(p => p.callcount);

        var outletcount = outlets.Count();
        //var outletcount = 0;
        //var average = outlets.Average(p => p.callcount);


        foreach (var outlet in outlets)
        {
            using (relenster_v2Entities db_2 = new relenster_v2Entities())
            {
                //loop over calls and add history
                //check the last time the history table was added to for this call
                var lastEntry = (from h in db_2.tblOutletDistributionHistories
                                 where h.OutletID == outlet.outlet.OutletID
                                 orderby h.VisitDate descending
                                 select h).FirstOrDefault();
                DateTime? beginLooking = null;

Я надеялся, что с помощью второго контекста данных можно будет освободить память после каждой итерации. Казалось бы, это не так (или GC не работает вовремя)

1 Ответ

0 голосов
/ 18 ноября 2010

С помощью ввода @adrift я изменил код так, чтобы сохранение изменений происходило после каждой итерации цикла, а не всех в конце. Может показаться, что существует предел (в любом случае, в моем случае) около 150 000 ожидающих записей, что контекст данных может успешно храниться до того, как потреблять слишком много памяти.

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

...