2012-12-19 17 views
9

Entity çerçevesini kullanarak yüzbinlerce kaydı kaydetmeye çalışıyorum.System.OutOfMemoryException?

: binlerce kayıt birkaç yüz kaydettikten sonra ben hata aşağıdaki almak System.OutOfMemoryException

Kodum

foreach (BibContent objbibcontents in lstBibContent) 
     { 
      db.BibContents.AddObject(objbibcontents); 
      c = c + 1; 
      if (c == 1000) 
      { 
       db.SaveChanges(); 
       c = 0; 
      } 
     } 

Ben 1000 benim db başka 1000 kayıt baskın olmadığından kaydeden kaydettikten sonra fark ettim. onları dbcontext'e ekliyor.

1000 kayıttan sonra yeni bir örnek oluşturuyorum ancak db'm yine bir önceki nesnenin verilerine sahip. Koduma bak

foreach (var objbibcontents in lstBibContent) 
      { 
       vibrantEntities db1 = new vibrantEntities(szConStr); 
       lstBibCon.Add(objbibcontents); 
       // db.BibContents.AddObject(objbibcontents); 
       c = c + 1; 
       if (c == 1000) 
       { 
        foreach (BibContent bibobject in lstBibCon) 
        { 
         db1.BibContents.AddObject(bibobject); 
        } 
        lstBibCon.Clear(); 
        db1.SaveChanges(); 
        c = 0; 
        flag = 1; 
       } 
      } 

cevap

12

Tek bir nesne ne kadar büyük ve ne kadar tasarruf edersiniz? DbContext, AddObject çağrısı ile eklediğiniz tüm nesnelerin referanslarını tutar. SaveChanges numaralı telefonu arayarak dahili veri yapılarını temizlemez, böylece kodunuzu 1M nesneleri için çağırırsanız, belleğinizde 1M nesnesine sahip olacaksınız ve bunlar tam olarak canlı olacaklardır çünkü GC için kök nesnesi hala çalışır durumda olan bağlam örneği olacaktır. kodu.

Bellek sorunlarından kaçınmak istiyorsanız, her 1000 kayıt için (hatta her kayıtta) yeni bir içerik örneği kullanmalısınız. 1000 kayıt ve tek kayıt için SaveChanges çalıştırmak arasındaki tek fark otomatik olarak ilgili işlemdir.

+0

i Doğrusu benim DBContext temizleyin sonra tekrar oluşturabilirim? –

+0

Her eklenmiş nesneyi ayrıldığınız şekilde ayarlamanız ve ayarlamanız gerekir. Yeni bir içerik örneği oluşturmak çok daha iyi bir yoldur. –