2017-10-31 1 views
0

많은 레코드가있는 테이블을 통해 반복하는 올바른 방법은 무엇입니까? 나는 지금까지 기록을 평가할 필요가있다. Entity Framework를 사용하여 MS SQL 데이터베이스에서 정보를 연결하고 가져옵니다. 간단한 foreach 루프를 사용하고있었습니다.Entity Framework foreach가 800,000 개가 넘는 레코드에

foreach (var x in MyEntity.MyTable) 
{ 
    //logic process 
} 

정확한 숫자가없는 500,000 개가 넘는 테이블에는 완벽하게 작동합니다. 문제는 응용 프로그램이 불안정 해지고 충돌 할 수있는 큰 테이블에 800,000 플러스 레코드가 기록되는 경우입니다. 나는 (4~6기가바이트 정도) RAM을 많이 사용하는 응용 프로그램을주의해야한다

+2

페이징 구현. 메모리에있는 모든 레코드가 한 번에 필요하지는 않습니다. 또한 응용 프로그램이 단순히 "불안정 해지고 충돌"하지 않는 경우에도 예외가 발생합니다. 그 예외를 연구하려고 했습니까? – CodeCaster

+1

프로세스 청크를 현명하게 처리하십시오. 또는이 작업을 SQL로만 만듭니다. –

+1

한 번에 500KB 레코드를 처리 하시겠습니까? –

답변

3

사용 AsNoTracking

foreach (var x in MyEntity.MyTable.AsNoTracking()) 

이 EF과 의지에 의해 추적되지 않는 이상 테이블의 각 항목이 반복 될 때이 사항을 확인합니다 DbContext에 붙어 있지 않아야하므로 인스턴스가 필요할 때 CLR에 의해 GC'ed 될 수 있습니다.

이는 항목을 변경할 수 없으며 해당 항목을 DbContext에 유지하기를 원한다는 것을 의미하므로이 작업을 수행하려면 인스턴스를 첨부해야합니다.


이 많은 양의 메모리를 사용하면 표시하지 않은 코드에 다른 문제가없는 것으로 가정 않습니다.

+2

이것은 여전히 ​​데이터베이스에서 800K 레코드를 요청하는 쿼리를 실행하지만 대부분 불필요합니다. – CodeCaster

관련 문제