2016-09-08 16 views
5

Tôi đang xây dựng một ứng dụng và đang sử dụng Entity Framework 6. Nhưng tôi đang gặp vấn đề với việc sử dụng bộ nhớ. Không có vấn đề gì tôi cố gắng tôi sớm hay muộn chạy vào một lỗi bộ nhớ. Cho đến nay tôi đã thử các cách sau:Entity Framework 6 sử dụng bộ nhớ đạt 2GB

  • Sử dụng cho ngữ cảnh.
  • Lưu thay đổi theo lô và xử lý ngữ cảnh.
  • Gọi thủ công GC.Collect().

Nhưng không cái nào trong số này ngăn khung Entity sử dụng nhiều bộ nhớ hơn với mọi saveChang tôi làm. Cuối cùng đạt tới giới hạn 2GB và làm hỏng chương trình của tôi.

Có cách nào tôi không biết làm cho Khung thực thể phát hành tất cả bộ nhớ không?

Sửa

using (var sqlite = new myEntities()) 
{ 
    sqlite.Configuration.AutoDetectChangesEnabled = false; 
    sqlite.Configuration.ValidateOnSaveEnabled = false; 

    foreach (var someItem in someList) 
    { 
     var newItem = new Item 
     { 
      ... 
     }; 

     sqlite.tableName.Add(newItem); 

     if (++countRecords%1000 == 0) 
     { 
      sqlite.SaveChanges(); 

     } 
    } 
    sqlite.SaveChanges(); 
} 

Như đã trình bày ở trên tôi cũng đã cố gắng thiết lập bối cảnh mà không có việc sử dụng và xử lý nó sau khi SaveChanges.

if (++countRecords%1000 == 0) 
{ 
    sqlite.SaveChanges(); 
    sqlite.Dispose(); 
    sqlite = new myEntities()  
} 
+2

Bạn có tạo phiên bản Ngữ cảnh mới cho từng yêu cầu vào cơ sở dữ liệu không? – Lance

+6

Để được trợ giúp, bạn cần phải tìm ra cách để tạo một chương trình tối thiểu nhưng đầy đủ để tái tạo lại vấn đề bộ nhớ. Nếu không, như bạn chắc chắn có thể hiểu, bất cứ điều gì chúng tôi đề nghị sẽ được đầu cơ thuần túy. – sstan

+1

bạn có thể chia sẻ truy vấn EF của mình không? – Sampath

Trả lời

1

Nếu nó thực sự là một vấn đề hàng loạt, hãy thử một cái gì đó như thế này:

int batchSize = 10; 

for (int i = 0; i < = someList.Count/batchSize; i++) 
{ 
    var batch = someList.Skip(batchSize * i).Take(batchSize); 

    using (var sqllite = new nyEntities()) 
    { 
     foreach(var item in batch) 
     { 
      var newItem = new Item() {...}; 

      sqllite.tableName.Add(newItem); 
     } 

     sqllite.SaveChanges(); 
    } 
} 

này sẽ đảo ngược tuyên bố sử dụng để xử lý các sqllite sau mỗi đợt, vì vậy thanh toán bù trừ nó ra và bắt đầu tươi cho mỗi lô .

Mã này được tạo bằng notepad ++, vì vậy hãy cẩn thận để làm sạch nó nếu bạn dùng thử.

+0

Vấn đề hàng loạt hay không Tôi thực sự thích luồng này, cảm ơn bạn. – BeebFreak

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