Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[14143] Re:Re:Re: 한번에 3GB기가 메모리 할당도 되는데요
Lyn [tohnokanna] 2135 읽음    2012-02-22 08:52
그러네요

빌더 님이 쓰신 글 :
: Lyn 님이 쓰신 글 :
: : 메모리 관리자가 2G 넘는 단일블럭을 지원 안할 뿐입니다.
: : 1G 씩 짤라서 여러번 할당하면 잘 됩니다
: :
: : (C#, Java도 2G넘는 블럭을 할당 할 수 없습니다... 현실적으로 블럭크기에 관계없이 할당 가능한 컴파일러는 VC++/IC++ 정도인듯)
: :
: : 윤승환 님이 쓰신 글 :
: : : 델마당에도 질문을 올렸는데 아무래도 64bit 프로그래밍해보신 분이 많지 않은 것 같네요.
: : : 경험있으신 분 의견 좀 부탁드립니다.
: : :
: : :
: : : ---------------------------------------------------------------------------
: : : XE2 Professional 구입/설치 후 처음 확인해보는 것이 64bit를 지원하는가였습니다.
: : :
: : : 테스트 방법의 문제인지 뭔가 설정을 해야하는데 빠뜨린 것인지
: : : 2GB를 초과하는 메모리쓰기는 여전히 실패하는군요.
: : :
: : :
: : : 64bit 프로그래밍해보신 분 계신지요?
: : :
: : :
: : :
: : : 환경: Windows 7 64 bit, 8GB RAM, 16GB 페이지 파일
: : :
: : :
: : : 1. target platform을 Win64로 변경하고 Win32는 삭제..
: : : 2. 아래 코드 입력 후 실행하면 정상 동작합니다.
: : :
: : : 3. 이제 GBSIZE=3로 변경 후 재실행 -> 오류 발생
: : :
: : :
: : :
: : : procedure TForm1.FormCreate(Sender: TObject);
: : : const
: : :   GBSIZE  =2;
: : : var
: : :   pMem  :PByte;
: : :   nSize :Int64;
: : :   i     :integer;
: : : begin
: : :   nSize :=1024*1024*1024{GB};
: : :   nSize :=nSize*GBSIZE;
: : :   pMem  :=AllocMem(nSize);
: : :
: : :
: : :   for i := 0 to GBSIZE*1024*1024-1 do
: : :     TRY
: : :       FillChar(pMem[i*1024],1024,0);
: : :     EXCEPT
: : :       OutputDebugString(PWideChar(Format('%d',[i])));
: : :     END;
: : : end;
:
:
:
:
: 답변:
:
: Lyn 님께서... 2GB 넘는 단일 블럭은 지원하지 않기때문에, 1GB 씩 나눠서 할당해야 한다고 답변하셨는데...
: 무엇을 근거로 그렇게 말씀하시는지 이해가 안갑니다. 제가 사용하는 컴도 Windows 7 64 bit 8GB RAM 입니다.
:
: 64비트 Native 컴파일러가 괜히 64비트 컴파일러겠습니까. 한번에 3GB 메모리 할당도 잘됩니다.
:
: 문제는 컴파일러에 있는게 아니고,  질문 올린 윤승환님의 소스코드에 버그가 있기 때문 입니다.
:
: 0 부터 GBSIZE*1024*1024-1 까지 루프를 돌리고 있는데,  FillChar(pMem[i*1024],1024,0); 식으로
: 메모리를 액세스 하면 당연히 문제가 발생할 수 밖에 없죠.
:
: 아래 소스를 참고 하세요. 3GB를 한번에 할당하고, FillChar 를 빨리 수행하기 위해서 MB 블럭 단위로
: 메모리 액세스하는 코드 입니다. Windows 7 64bit 8GB Memory 컴에서 테스트 한 겁니다.
:
:
: 
: procedure TForm1.Button1Click(Sender: TObject);
: const
:   GBSIZE = 1024 * 1024 * 1024;
:   MBSIZE = 1024 * 1024;
: 
: var
:   pMem      : PByte;
:   nGBSize   : Cardinal;
:   nMBBlocks : Cardinal;
:   I         : Cardinal;
: 
: begin
:   nGBSize   := GBSIZE;
:   nGBSize   := nGBSize * 3;    // 3GB
:   nMBBlocks := nGBSize div MBSIZE;
:   try
:       try
:         pMem  := AllocMem( nGBSize );
:         Caption := '3GB Memory Allocated...';
: 
:         for I := 0 to nMBBlocks - 1 do
:           FillChar( pMem[I * MBSIZE], MBSIZE, 0);
:       except
:         on EOutOfMemory do Caption := 'Fail - Not Enough Memory...';
:       end;
:   finally
:       FreeMem(pMem);
:   end;
: end;
: 
: 

+ -

관련 글 리스트
14140 XE2 에서 64bit 프로그래밍해보신 분 계신가요? 윤승환 2043 2012/02/21
14141     Re:XE2 에서 64bit 프로그래밍해보신 분 계신가요? Lyn 2155 2012/02/21
14142         Re:Re: 한번에 3GB기가 메모리 할당도 되는데요 빌더 2422 2012/02/22
14144             Re: 빠른 확인 감사합니다. 건비 1943 2012/02/22
14143             Re:Re:Re: 한번에 3GB기가 메모리 할당도 되는데요 Lyn 2135 2012/02/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.