2012-12-19 33 views
9

Tôi đang cố gắng tiết kiệm hàng trăm nghìn bản ghi bằng cách sử dụng khung Entity. Sau khi lưu vài trăm ngàn hồ sơ tôi nhận được lỗi sau:System.OutOfMemoryException sử dụng Khung thực thể?

: System.OutOfMemoryException

Mã của tôi

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

tôi nhận thấy sau khi tiết kiệm 1000 ghi db của tôi không được trọng khác 1.000 hồ sơ. nó đang thêm chúng vào dbcontext của tôi.

Tôi đang tạo một phiên bản mới sau 1000 bản ghi nhưng db của tôi vẫn có dữ liệu của đối tượng trước đó. Xem mã của tôi

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; 
       } 
      } 

Trả lời

12

Bạn sẽ lưu bao nhiêu đối tượng và đối tượng đơn lớn là bao nhiêu? DbContext giữ tham chiếu đến tất cả các đối tượng bạn đã thêm với cuộc gọi AddObject. Gọi SaveChanges không xóa cấu trúc dữ liệu nội bộ của nó, vì vậy nếu bạn gọi mã cho đối tượng 1M, bạn sẽ có đối tượng 1M trong bộ nhớ và chúng sẽ hoàn toàn còn sống vì đối tượng gốc của chúng cho GC sẽ là cá thể ngữ cảnh vẫn nằm trong phạm vi chạy của bạn mã.

Nếu bạn muốn tránh vấn đề bộ nhớ, bạn nên sử dụng một phiên bản ngữ cảnh mới cho mỗi 1000 bản ghi (hoặc thậm chí mọi bản ghi). Sự khác biệt duy nhất giữa việc chạy SaveChanges cho 1000 bản ghi và cho một bản ghi là giao dịch tự động liên quan.

+0

tôi có thể xóa dbcontext của mình thay vì tạo lại không? –

+0

Bạn sẽ phải đi và thiết lập từng đối tượng được thêm vào như tách ra. Tạo một thể hiện ngữ cảnh mới là cách tốt hơn nhiều. –

Các vấn đề liên quan