2013-02-18 2 views
2

큰 텍스트 파일을 메모리로 읽어 들이고 처리하는 간단한 asp.net 웹 사이트가 있습니다. 다음은 OOM 예외를 발생시키는 코드입니다. 약 350k 라인을 읽은 후에이 오류가 발생합니다. 각 행의 평균 문자 수는 1k입니다. IIS 또는 ASP.Net 웹 사이트에 일부 메모리 제한이 있습니까? 내 서버에는 아직 많은 실제 메모리가 남아 있습니다. 감사.asp.net에서 메모리 부족 예외가 발생하는 이유

List<string> geos = new List<string>(); 
using (StreamReader geoReader = new StreamReader(File.OpenRead("file.txt"))) 
{ 
    while (geoReader.EndOfStream == false) 
    { 
     try 
     { 
      geos.Add(geoReader.ReadLine()); 
     } 
     catch (Exception ex) { } 
    } 
} 
+1

충돌 구문에서 메모리 덤프를 캡처하도록 adplus를 설정하면 다음과 같은 결과가 나타납니다. adplus -crash -iis : http://msdn.microsoft.com/en-us/magazine/cc163833.aspx –

+0

실제로 메모리 제한이 있습니다. .그물. 처리하기 전에 데이터를 청크로 분해 할 수 있습니까? –

+0

당신은 메모리 한계를 무시할 수 있지만, 그것은 깨지기 쉬운 접근 방법, 더 큰 파일, 더 많은 메모리 객체를 처리하는 것만으로 그것을 사용할 것입니다. 살펴볼 사항은 메모리로 모든 데이터를 필요로하는 것입니다. OOM은 실제 컴퓨터가 아닌 메모리가 부족한 네트워크 프로세스입니다. 실제로 수집 한 후에도 처리 할 수 ​​없었던 것은 메모리의 연속적인 자유 블록을 찾습니다. –

답변

2

대부분의 경우 작업자 프로세스는 32 비트 (x86)로 구성됩니다. 이 경우 할당 된 객체의 약 2GB에서 최소한 OOM을 수행하지만 그보다 훨씬 이전 일 것입니다.

실제로 메모리에서 1GB의 객체를로드한다고 가정하면 64 비트 프로세스에서 코드를 실행하는 것이 좋습니다.

참고 : 실제 메모리가 부족하다고 가정 할 경우 2GB + 할당을 한 번에 시도하는 것과 달리 OOM이 기본적으로 삭제됩니다 (최신 .Net은 내가 기억하는 한 더 큰 할당을 허용합니다).

1

msdn에서 검색 한 결과 몇 가지를 발견하여 도움을 얻을 수있었습니다. 첫째, OutOfMemoryException이 발생의 가능성 "프로세스 \ 가상 바이트는"가상 주소 공간 제한 (일반적으로 2기가바이트)의 600메가바이트 내에있을 때 극적으로 증가하기 시작하고, :

가 고려해야 할 몇 가지 있습니다 둘째, "Process \ Virtual Bytes"가 "Process \ Private Bytes"보다 600MB 이상 큰 경우가 종종 있습니다. 이 차이는 부분적으로 GC가 유지 관리하는 MEM_RESERVE 영역으로 인해 필요할 때 더 많은 메모리를 신속하게 커밋 할 수있게합니다. 이를 종합하면 "Process \ Private Bytes"가 800MB를 초과하면 OutOfMemoryException이 발생할 가능성이 높아집니다. 이 예에서는 컴퓨터에 4GB의 실제 RAM이 있으므로 메모리 부족 조건을 피하려면 메모리 제한을 20 %로 설정해야합니다. 머신의 메모리 사용을 최대화하기 위해이 숫자를 시험해 볼 수도 있지만, 안전하게 재생하려면 예제의 숫자가 작동합니다. 요약하면 메모리 제한을 실제 RAM의 60 % 또는 800MB 중 작은 값으로 설정하십시오. 버전 1.1은 3기가바이트 가상 주소 공간을 지원하기 때문에 당신이 boot.ini에에/3GB를 추가하는 경우, 당신은 안전하게 상한

http://msdn.microsoft.com/en-us/library/ms972959

또 다른 원인으로 1,800메가바이트 대신 800 메가 바이트 사용할 수 있습니다 할 수있다 .NET Framework 1.1 용 서비스 팩 1이 설치되어 있지 않아야합니다. 서비스 팩을 설치하지 않고 메모리 예외가 발생할 가능성이 더 높습니다.

관련 문제