문제

이해할 수 있듯이 .NET의 단일 인스턴스에는 2GB 제한이 있습니다. 지금까지 32 비트 OS에서 주로 작업했기 때문에 많은 관심을 기울이지 않았습니다. 32 세는하지만 어쨌든 인공적인 한계입니다. 그러나 나는 그것을 배우는 것에 매우 놀랐습니다 이 제한은 64 비트 .NET에도 적용됩니다.

다음과 같은 컬렉션 이후 List<T> 배열을 사용하여 항목을 저장하십시오. 즉, 32 비트에서 실행되는 .NET 응용 프로그램은 64 비트에서 실행되는 동일한 응용 프로그램에 비해 목록에서 두 배의 참조 유형 항목을 유지할 수 있습니다. 그것은 매우 놀랍습니다.

이 제한이 CLR 4.0에서 다루어 있는지 아는 사람이 있습니까 (현재 4.0 설치가 없음).

도움이 되었습니까?

해결책

32 비트의 .NET에서 작업 할 때 프로세스 공간이 이론적 한계보다 훨씬 작습니다. 32 비트 .NET 앱에서 내 경험은 항상 1.2-1.4GB의 메모리 사용량 어딘가에 메모리 오류를 벗어나기 시작하는 경향이 있다는 것입니다. ). 물론 이것은 64 비트 시스템에서 문제가되지 않습니다.

즉, 64 비트 시스템에서도 단일 2GB의 참조 유형은 엄청난 양의 객체입니다. 8 바이트 참조를 사용하더라도 268,435,456 개의 객체 참조 배열을 할당 할 수 있습니다. 각 배열은 매우 클 수 있습니다 (최대 2GB, 중첩 객체를 사용하는 경우 더 많음). 그것은 대부분의 응용 프로그램에서 실제로 요구되는 것보다 더 많은 기억입니다.

회원 중 하나 CLR 팀은 이것에 대해 블로그를 작성했습니다, 이러한 제한 사항을 해결하는 방법을위한 몇 가지 옵션이 있습니다. 64 비트 시스템에서 그의 bigarray와 같은 일을u003CT> 2GB 단일 객체 제한보다 훨씬 많은 객체를 배열에 할당하는 실행 가능한 솔루션입니다. P/Invoke를 사용하면 더 큰 배열도 할당 할 수 있습니다.


편집 : 나는 이것을 언급 했어야한다.


편집 : .NET 4.5는 이제 x64에 옵션이 설정되어 설정을 통해 객체를 2GB보다 크게 더 크게 허용합니다. gcallowverylargeobjects app.config에서.

다른 팁

.넷 프레임 워크 4.5 64 비트 플랫폼에서 2GB보다 큰 배열을 만들 수 있습니다. 이 기능은 기본적으로 켜져 있지 않으므로 GCALLAYLARGEOBJECTS 요소를 사용하여 구성 파일을 통해 활성화해야합니다.

http://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx

이것은 수치 필드에서 큰 문제입니다. .NET에 숫자 클래스 라이브러리를 사용하는 사람은 매트릭스가 아래에 배열로 저장되어 있습니다. 이것은 기본 라이브러리가 부름을받을 수 있습니다. 2GB 제한은 64 비트 .net에서 가능한 행렬의 크기를 심각하게 방해합니다. 더 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top