배경 : 나는 많은 양의 지리 데이터로 작업하는 C++ 프로그램을 작성 중이며 한 번에 처리 할 큰 청크를로드하려고합니다. 32 비트 컴퓨터 용으로 컴파일 된 응용 프로그램을 사용하는 데 제약이 있습니다. 내가 테스트하고있는 컴퓨터는 64 비트 OS (Windows 7)를 실행 중이며 6 기가의 RAM이 있습니다. 사용 MS VS 2008얼마나 많은 메모리를 할당 할 수 있습니까?
나는 다음과 같은 코드를 가지고 : 나는 응용 프로그램이 32 비트 주소의 4 기가 바이트 한계에 도달 할 때까지 내가 메모리를 할당 할 수있을 것이라고 기대했다
byte* pTempBuffer2[3];
try
{
//size_t nBufSize = nBandBytes*m_nBandCount;
pTempBuffer2[0] = new byte[nBandBytes];
pTempBuffer2[1] = new byte[nBandBytes];
pTempBuffer2[2] = new byte[nBandBytes];
}
catch (std::bad_alloc)
{
// If we didn't get the memory just don't buffer and we will get data one
// piece at a time.
return;
}
합니다. 그러나 nBandBytes가 466,560,000이면 두 번째 시도에서 std :: bad_alloc을 throw합니다. 이 단계에서 프로세스의 작업 집합 (메모리) 값은 665,232 K입니다. 따라서 할당 된 메모리조차도 얻을 수없는 것 같습니다.
win32 용/3GB 스위치를 사용하여 3 기가로 확장 할 수있는 32 비트 Windows의 응용 프로그램에 대한 2 기가 제한에 대한 언급이있었습니다. 이는 해당 환경에서 좋은 조언이지만이 경우에는 관련이 없습니다.
64 비트 OS에서 32 비트 응용 프로그램으로 할당 할 수있는 메모리 용량은 어느 정도입니까?
웹에서이 참조를 발견했습니다. "64 비트 OS에서 32 비트 응용 프로그램으로 실행하는 경우 4G 주소 공간을 모두 확보 할 수 있으며 모든 물리적 메모리가 물리적 메모리로 백업 될 수 있습니다. 심지어 당신이 64 비트 포인터를 사용하지 않고도 RAM을가집니다.) 블로그 : http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx – Bill
내 32 비트 컴퓨터에서 466,560,000 × 3 바이트를 간단한 테스트로 할당 할 수 있습니다. 당신의 경우 할당 포인트에서 이미 조각난 프로세스 메모리로 보입니다. –
이 질문에 대한 답을 고르는 데 어려움을 겪었습니다. 대답은 복잡하고 많은 요인에 따라 다릅니다. 메모리 매핑 된 파일은 좋은 대답이지만이 문제의 근본 원인은 메모리 조각화 인 것 같습니다. bke1은 메모리를보기위한 좋은 도구를 지적했으며 많은 사람들이 메모리 조각화에 대해 이야기했지만 문제를 명확히 언급하고 (64 비트 및 4 비트에서 4 기가비트) 하드 디스크를 제공하는 첫 번째 대답을 선택했습니다. – Bill