2015-01-12 3 views
0

나는 C# appliaction을 얻었고 entity famework을 ORM으로 사용했습니다. 테이블이 Images 인 데이터베이스가 있습니다. 표에는 Id, TimeStamp, Data 열이 있습니다. 이 테이블은 실제로 많이 존재할 수 있습니다. 또한 Data 열에는 큰 바이트 배열이 포함됩니다. 예를 들어, 어떤 날짜부터 시작하여 첫 번째 엔티티를 가져와야합니다.많은 양의 데이터로 작업하기

var result = Images.OrderBy(img => img.TimeStamp).FirstOrDefault(img => img.TimeStamp > someDate); 

메모리 예외가 발생합니다. 전달할 수있는 방법이 있습니까? 저장 프로 시저 또는 다른 것을 사용해야합니까?

+1

인덱스를 살펴보고 타임 스탬프로 정렬 된 인덱스를 만들고 해당 인덱스에서 작업을 선택하십시오. – Sefa

+0

이미지가 객체의 구체화 된 목록이 아닌가? 그렇다면 왜 정렬하려고하면 메모리 부족 예외가 발생하는지 이해할 수 있습니다. – smiech

+0

큰 데이터가있는 열을 가상으로 표시 할 수도 있습니다. – hazimdikenli

답변

2

Images이 이미 쿼리 된 개체 인 경우 OrderBy 일 때 전체 집합에 액세스합니다. 나는 그렇지 않다고 가정하고 직접 DbSet 또는 EF IQueryable입니다 (그래서 Linq-To-Entity가 아니라 Linq-To-Entity를 사용하여 쿼리하고 있으므로 데이터베이스에 대한 쿼리가 순서대로 수행됩니다. 반환 된 전체 세트가 아님).

당신이 AsNoTracking을 추적 탐지를 변경 사용이 필요하지 않는 한 당신의 DbSet (변경 추적 감지) 배 이상의 메모리가 필요합니다. (이 경우, Context.Images.AsNoTracking().OrderBy(...)에 그 많은에 의해 메모리 요구 사항을 낮출한다.

을 또한, 대형 BLOB 데이터를 사용하는 경우 자체 테이블 (iddata)에 저장하고 필요한 경우에만 액세스하는 것이 좋습니다 (수행중인 테이블/엔티티에 대한 id에 대한 참조가 있음). ORM을 사용하고 있고 항상 원래 엔티티와 작업하고 싶다면 (예 : Select을 사용하여 새 엔티티에 대한 쿼리를 투영 할 수 있습니다. thlob the blob 필드).

의 경우 항상 반환되는 행의 이미지 데이터에 액세스해야하고 시스템에 충분한 메모리가 없으면 운이 좋지 않습니다.

관련 문제