2020년 4월 1일 수요일

Window C++ 가용 메모리 확보하기

C++ 코드를 만드실때 샘플을 보시면 파일을 복사 하거나 메모리를 확보 할때 버퍼 용량을
512Byte 또는 1024Byte 로 제한된 것을 볼수 있습니다.
이전에 만들어진 코드를 재활용을 하다 보니 문제는 없으나 대용량 파일을 처리 하거나 메모리를 운영시에는 작은 사이즈의 버퍼를 운영 하다 보니 속도의 이슈가 생기기 마련 입니다.
윈도우에서 사용할수 있는 가용 버퍼를 확인 하는 방법을 알아 보겠습니다.


일단 코드 부터 확인 하겠습니다.


MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
const UINT MINBUFF = 1024;
UINT nUsageMemSize = status.ullAvailVirtual;
float fMemPercent = 0.0;
  
while (true)
{
 try
 {
  LPBYTE lpChk = new BYTE[nUsageMemSize];
  if (lpChk != NULL)
  {
   delete[] lpChk;
   break;
  }
 }
 catch (CMemoryException* e)
 {
  fMemPercent = fMemPercent == 0.0 ? 0.1 : fMemPercent*0.1;
  nUsageMemSize = status.ullAvailVirtual * fMemPercent;
  if (nUsageMemSize < MINBUFF)
   nUsageMemSize = MINBUFF;
 }
}

TRACE(_T("nUsageMemSize [%u]"), nUsageMemSize);

<위 코드는 Visual Studio 2013 Window 10 64bit에서 테스트 하였습니다>
위코드를 실행 하시면 현재 프로그램에서 가용할수 있는 버퍼를 찾으실수 있습니다.
동작 방법은 윈도우 SDK 에서 제공하는 MEMORYSTATUSEX 구조체를 활용합니다.




위 GlobalMemoryStatusEx 함수를 이용하시면 현재 시스템의 메모리 정보를 얻어 옵니다.
제가 활용한 멤버는 현재 프로세스에 할당된 가용 메모리 항목입니다. (ullAvailVirtual)
위 항목으로 메모리 용량을 확보 하면 메모리가 할당이 안될수 있기 때문에 Exception 코드를 걸어 둬서
메모리 용량 확보에 실패 하면 원래 크기의 0.1 만큼 할당하는 로직입니다. 반복적으로 메모리 용량 확보에 실패시
0.1=>0.01=>0.001 이렇게 지속적으로 작게 메모리를 할당하여 얻을수 있는 크기를 얻어 옵니다.


대용량 파일을 직접 복사하는 코드를 구현 하실때 또는 기타 사항으로 처리 하시면 좋을듯 하네요. 그럼 ^^

댓글 없음: