프로그램에 더 많은 메모리를 부여하도록 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는 요즘 서버에서 정말 많이 쓰이지는 않습니다 ...
거기에 메모리 누수가 있습니다. 더 많은 RAM을 추가하는 것은 해결책이 아닙니다. 앱 코드에서 누출되는 위치를 확인하십시오. – Rahul
메모리에서 1.5GB의 문자열을 필요로하지 않는 코드로 코드를 변경해야합니다. OOM Exception 옆에는 32 비트 프로세스의 주소, 조각화 또는 실제 메모리 외의 실제 메모리와 다른 것을 의미하는 경우가 많습니다. – Console
'프로그램 전체가 실행 중인지 알아두면 좋을 것입니다. 메모리가 부족하거나 하나의 특별한 라인이 있으면 SplitInternal이이 예외를 throw 할 수 있습니다. 다른 좋은 점은 실행중인 코드 일 수 있습니다. – mjwills