2017-10-17 1 views
0

프로그램에 더 많은 메모리를 부여하도록 Windows에 지시하는 방법이 있습니까? 차라리 잘 작동하는 간단한 프로그램을 다시 코딩하는 것보다는 차라리 그렇게 할 것입니다.OutOfMemoryException을받는 프로그램에 더 많은 RAM을 할당 할 수 있습니까?

15 분마다 실행되는 C# 프로그램이 있으며 새 들어오는 파일과 이전 파일을 비교합니다. 새 파일과 이전 파일 모두 "|"입니다. 분리되어 메모리로 읽혀진다. 우리는 최적화를 시도하지 않았으며, 모든 것을 사전으로 읽고 간단히 비교합니다.

우리는이 오류를 받고있어,

Message: Exception of type 'System.OutOfMemoryException' was thrown. at 
System.String.SplitInternal(Char[] separator, Int32 count, 
          StringSplitOptions options) 
at System.String.Split(Char[] separator) 

이 파일은 각각 1000에 대한 회선이 있고 각 행은 파이프로 구분 된 필드의 하나로서 base64로 인코딩 된 큰 이미지를 가지고있다. 각 줄은 500K-700K가 될 수 있으므로 각 파일의 총 크기는 약 600MB입니다. 어쩌면 가끔씩 1MB를 초과 할 수도 있습니다.

우리는 프로그램이 1.5GB 정도의 RAM을 사용한다고 추정합니다. 코드를 최적화하는 대신 RAM을 추가로 제공하고 싶습니다. 또는 프로그램 전체에서 메모리가 부족하거나 특정 큰 라인이 SplitInternal에서이 예외를 throw 할 수 있는지 여부를 확인하는 것이 좋습니다.

Windows Server 2012 R2.

편집 : 문제가되는 코드 줄은 "string [] data = info.Split ('|');"입니다. 루프의 내부. 이 예외가 잡히면 프로그램은 계속해서 다른 여러 줄을 잘 처리합니다.

다시 작성하는 것을 회피하지 않지만 더 쉬운 방법이 있다면 먼저 시도하고 싶습니다. 우리는 "32 비트 선호"체크 박스로 컴파일되었음을 확인 했으므로, 먼저 체크하지 않고 무슨 일이 일어나는지 살펴볼 것입니다. 결국, 2GB는 요즘 서버에서 정말 많이 쓰이지는 않습니다 ...

+3

거기에 메모리 누수가 있습니다. 더 많은 RAM을 추가하는 것은 해결책이 아닙니다. 앱 코드에서 누출되는 위치를 확인하십시오. – Rahul

+0

메모리에서 1.5GB의 문자열을 필요로하지 않는 코드로 코드를 변경해야합니다. OOM Exception 옆에는 32 비트 프로세스의 주소, 조각화 또는 실제 메모리 외의 실제 메모리와 다른 것을 의미하는 경우가 많습니다. – Console

+0

'프로그램 전체가 실행 중인지 알아두면 좋을 것입니다. 메모리가 부족하거나 하나의 특별한 라인이 있으면 SplitInternal이이 예외를 throw 할 수 있습니다. 다른 좋은 점은 실행중인 코드 일 수 있습니다. – mjwills

답변

1

"32 비트 선호"가 설정되어 있습니까? 다른 곳에서 아무런 문제가 없습니다 가정, 만약 그렇다면

What is the purpose of the "Prefer 32-bit" setting in Visual Studio 2012 and how does it actually work?

는 사용하지 않도록 설정, 당신은 지금 사용할 수있는 RAM의 대부분을 사용할 수 있어야합니다.

+0

예, 설정되었습니다. 하지 않고 시도하고 무슨 일이 일어날 지. 감사! – royappa

+0

우리의 파트너는 때로는 이미지가 최대 4MB 크기이며 동시에 이미지 크기가 10K로 감소 함을 알아 냈습니다.그렇다면 이것이 효과가 있었는지는 명확하지 않지만 모든 것에 64 비트를 사용하고 싶다면 가장 유용한 대답입니다. 감사합니다 - 그리고 모두! – royappa

+0

@royappa https://stackoverflow.com/a/6655492/310988과 같이 코드를 여러 개 체크 아웃하면 여러 문자열을 읽을 때 스트림을 잘게 썰어 볼 수 있습니다. 이렇게하면 전체 문자열을 읽지 않아도되고 큰 문자열에서 더 작은 문자열을 만들지 않아도됩니다. – AndyJ

관련 문제