2014-11-12 4 views
0

저는 엔티티 프레임 워크에서 여러 가지 객체를 반복하면서 관련 데이터를 수집하고 그 데이터를 저장합니다. 메서드에서 작업을 수행하는 데 시간이 걸리기 때문에 각 항목에 대해 새 스레드를 여는 중입니다. 그러나, 나는 루프에서 2 천개의 아이템을 제외하고는 메모리를 벗어날 것이다. 이 문제가 발생하는 곳과 멀티 스레드 기능을 유지하는 방법을 파악하려고하지만 오류를 수정하십시오. 어떤 도움이라도 대단히 감사합니다. 고맙습니다.메모리 부족시 예외 엔티티 프레임 워크

+0

['DataRepository'] (http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository) 및 작업 단위 패턴 -에서 - ASP NET에서 - MVC 응용 프로그램)'IDisposable'? 그렇다면,'using' 문으로 포장하십시오. – dbc

+0

IDisposable :( – JCab

+2

['DbContext']와 같은 일회용 멤버가 포함되어 있습니까? (http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext%28v=vs.113%29 .aspx)? 그렇다면 처분해야 할 수도 있습니다. – dbc

답변

1

전체 작업에 대해 동일한 DbContext를 사용하는 경우 해당 캐시로 인해 메모리 부족 오류가 발생할 수 있습니다. XML 파일에서 많은 양의 데이터를 파싱하고 저장할 때 비슷한 상황이 발생했습니다.

당신은 DBC에서 알 수 있듯이, 당신의 저장소 일회용하게 한 다음 사용 절에 포장한다 : 일회용 패턴을 구현하는 방법에 대한

public void ParsePage(Product p) 
{ 
    using (var repo = new DataRepository()) 
    { 
     //Grab related page report 
     PageReport pr = repo.PageReports.Where(c => c.ThePageType == "Product").FirstOrDefault(c => c.ThePageTypeID == p.ProductID); 

     //Do some stuff 

     //Save 
     repo.SavePageReport(pr); 
    } 
} 

정보 here

2

당신은 할 수있다 찾을 수 있습니다 각 스레드에 default stack size of 1 MB이 있기 때문에 메모리가 부족합니다.

  • 동적 데이터 2기가바이트 - Windows에서 응용 프로그램 *

    32 비트

    • 정적 데이터에 대한

      메모리 제한 : 2000 스레드가 max on your system 수 있습니다 스택 2GB의, 의미 시작 - 2GB

    • 스택 데이터 - 1GB (스택 크기는 링커에서 설정하며 기본값은 1MB이며 시스템> 스택 예약 크기 인 Linker 속성을 사용하여 늘릴 수 있음)

    32 비트 Windows에서는 모든 유형의 데이터 합계가 2GB 이하 여야합니다. 2기가바이트

  • 동적 데이터 - - 8TB
  • 스택 데이터 - 1 기가 바이트 (스택의 크기가 실질적인 한계 때문에 윈도우 자체

    64 비트

    • 정적 데이터에 의해 사용되는 공간 1.75GB 관한 링커 설정, 기본값은 1메가바이트이> 스택 예약 크기)

    참조이 0,123,477 링커 속성 시스템을 사용하여 증가시킬 수있다 자세한 내용은및이 stackoverflow question을 참조하십시오.

    KroaX에 따르면 더 새로운 task 및 이전 버전의 threadpool 라이브러리는 이와 같은 상황을 처리하도록 설계되었습니다. 스레드와 작업간에 추상화 수준을 추가로 제공하여 스레드가 사용 가능 해지면 할당되는 수천 개의 경량 작업을 쉽게 만들 수 있습니다.