2011-02-25 75 views
0

當我嘗試使用後約25000更新我得到一個異常,內存亞音速3.0.0.4更新很多帖子(〜50000)。 (Windows7,VS10,SQLServer2008R2)亞音速3.0.0.4更新了內存

var myTable = new SubSonicRepository<MyObject>(new MyDB()); 
getDataFromALargeList 

foreach(post in LargeList) 
{ 
    var myObject=GetMyObject(int myID) 
    myObject.property1=.. 
    myObject.property2=.. 
    myTable.Update(myObject); 
} 
private MyObject GetMyObject(int myID) 
{ 
    var myObject = new MyObject(); 
    var tbl = new SubSonicRepository<MyObject>(new MyDB()); 
    return tbl.Load(myObject, "ID", id) ? myObject : new MyObject(); 
} 

任何想法?

回答

0

你需要做分批你的更新,如果你真的想你的應用程序代碼中做到這一點,因爲你的帖子的對象超過了.NET運行時的內存分配限制。

您的代碼應該算的,你需要處理的總記錄數,然後說500的批次選擇要處理的記錄,直到處理完畢。通過這種方式,垃圾收集器可以回收內存,因爲您的後期對象超出了範圍(對於每個批次),並且您可以處理所有記錄。

或者,這可能是這些場合是值得下降到原始SQL的一個。如果你經常做這些更新,那麼在數據庫中編寫一個程序來完成這些工作可能是值得的。

+0

好吧,我沒有得到批量更新的工作。你有這樣的代碼示例嗎?感謝您的快速回復! :-) – Mats 2011-02-25 13:23:41

1

我遇到同樣的問題與亞音速3 ActiveRecord的。 對全基因代碼的快速調查顯示,每個亞音速ActiveRecord對象都創建了一個新的數據庫實例,一個新的存儲庫和一個新表。代碼基本上是:

_db=new Northwind.Data.NorthwindDB(); 
_repo = new SubSonicRepository<Products>(_db); 
tbl=_repo.GetTable(); 

這發生在您創建的每個ActiveRecord實例上。

如果您正在使用大數據的工作集的LinqTemplates是佔用更少的內存。 比如我通過加載10萬條記錄

// ActiveRecord: slow, eventually ended in a OutOfMemoryException 
var query = from p in Products.All() 
      select p; 
var products = query.ToList(); 

// LinqTemplates: runs fast with at least no memory footprint 
// (except for the data itself) 
var db = new Northwind.Data.NorthwindDB(); 
var query = from p in db.Products 
      select p; 
var products = query.ToList(); 

您應該使用ActiveRecord的彭定康謹慎有問題。 從數據庫中提取單個記錄,更新一些值並保持更改甚至是快速更新多個記錄(假設多達1000個記錄器)是很好的,但對於大量數據,它不是最佳選擇,因爲開銷。

無論如何,從數據庫中提取記錄只是爲了更新值是一個不錯的選擇,對於ActiveRecord和LinqTemplates都是不錯的選擇(除非您有充足的理由,例如您在DAL對象中實現了一些業務邏輯)。

你有沒有考慮過只是在做一個更新呢?

db.Update<MyObject>() 
    .Set(x => x.property1 == 5) 
    .Set(x => x.property2 == "Hello World") 
    .Where(x => x.ID == 1) 
    .Execute();