2011-02-25 4 views
0

약 25000 건의 업데이트 후 SubSonic 3.0.0.4를 사용하여 많은 게시물 (~ 50000)을 업데이트하려고하면 예외가 발생합니다. (Windows7, VS10, SQLServer2008R2)SubSonic 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

1

아음속 3 ActiveRecord에서 같은 문제가 발생했습니다. Generative 코드를 빠르게 조사한 결과, 모든 아음속 ActiveRecord 객체는 새 DB 인스턴스, 새 Repository 및 새 테이블을 만들었습니다. 코드는 기본적으로 다음과 같습니다.

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

사용자가 만든 모든 ActiveRecord 인스턴스에 대해 발생합니다.

큰 데이터 세트로 작업하는 경우 LinqTemplates는 메모리를 덜 소비합니다. 는 예를 들어 나는 100000 개 기록

// 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(); 

당신은주의와 액티브의 귀갑를 사용해야로드하여 문제가있어. db에서 하나의 레코드를 가져 와서 일부 값을 업데이트하고 변경 사항을 유지하거나 여러 레코드를 빠르게 업데이트하는 경우에 유용합니다 (최대 1000 개의 레코드를 말하도록합시다).하지만 데이터의 크기가 적을 경우 최상의 선택이 아닙니다. 오버 헤드.

어쨌든, 값을 업데이트하기 위해 DB에서 레코드를 가져 오는 것은 나쁜 선택입니다 : ActiveRecord와 LinqTemplates (당신이 DAL 오브젝트에 비즈니스 로직을 구현 한 것과 같은 좋은 이유가없는 한).

대신 업데이트를 고려한 적이 있습니까?

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