2012-06-21 5 views
0

데이터베이스에서 페치 할 때 내 응용 프로그램에서 OutOfMemory 예외가 발생합니다. Linq2Sql을 사용하는 C# .Net 응용 프로그램입니다.Linq2Sql 메모리 부족 예외

을 사용하여 데이터베이스 호출 전후의 메모리 사용량을 확인하려고했습니다. 이 일은 벌어지고있는 일에 대해 아주 정확하지는 않지만 훌륭합니다. 나는 Windows 작업 관리자에서 볼 때 나는 피크 작업 집합이라고 볼 수없는 작은 다음 코드를 사용하여 페이지 된 방식으로 데이터를 가져 오는 경우 :

public static void PreloadPaged() 
{ 
    int NoPoints = PointRepository.Count(); 
    int pagesize = 50000; 
    int fetchedRows = 0; 

    while (fetchedRows < NoPoints) 
    { 
     PreloadPointEntity.Points.AddRange(PointRepository.ReadPaged(pagesize, fetchedRows)); 
     PointRepository.ReadPointCollections(); 
     PreloadPointEntity.PointCollections.Count()); 
     fetchedRows += pagesize; 
    } 
} 


private static List<PointEntity> ReadPaged(int pagesize, int fetchedRows) 
{ 
    DataModel dataContext = InstantiateDataModel(); 
    var Points = (from p in dataContext.PointDatas 
       select p.ToEntity()); 

    return Points.Skip(fetchedRows).Take(pagesize).ToList(); 
} 

나는 그것이까지 사용하는 Linq2Sql 코드 추측을 메모리를 재사용하거나 나중에 다시 사용하지 않겠지 만 메모리 발을 인쇄하려면 어떻게해야합니까?

데이터를 가져 오는 데 10 배나 많은 메모리가 필요하다는 것을 알았습니다. 데이터를 내 목록에 저장하는 것과 같습니다. 가비지 컬렉터를 호출하는 것을 고려해 왔지만 차라리 사용하지 않을 것입니다.

+2

왜 '50000' 행을 한 번에 검색해야합니까? –

+0

해당 단체와 더 이상 무엇을 할 계획입니까? –

+0

50000은 실험 목적으로 선택된 페이지 크기이며, 모두 처리해야하는 좌표계를 프리 페칭합니다. 그래서 저는 그것들을 엔티티 목록에 저장하고 다른 좌표가 필요할 때마다 새로운 DB 연결을 만들어야하는 대신 거기에서 액세스합니다. – Keller

답변

2

너무 많은 데이터를 검색하여 메모리에 저장하는 것이므로 OOM 예외가 발생합니다. 2 가지의

(1) 발생 : 사용자가 결과의 하위 집합 만 볼 때이 데이터를 너무 많이로드 및/또는이 "캐시"데이터에 첫번째 시도이다

  1. .
  2. 이 모든 데이터가 필요하지만 잘못된 기술 (Linq2Sql)을 사용하여 데이터에 액세스하고 있습니다. 이 첫 번째의 경우

, 당신은 필요 하나이 표시 목적으로 전용의 경우는 데이터의

  1. 부하 작은 청크 (20-50 기록하지 50K 또는 모든)
  2. , 다음 질의 엔티티 자체보다는 필요한 것의 투사입니다.

대용량 데이터를 관리하도록 설계된 ETL 도구를 사용하는 것보다 두 번째 인 경우 두 번째입니다. 나는 Rhino.ETL을 선호하지만 SSIS도 작동합니다.

+0

아마도 Linq2SQL은 데이터 양에 사용할 수있는 최고의 프레임 워크가 아니므로 여기서 제안한 ETL 도구를 살펴 보겠습니다. 감사합니다. – Keller