[UE5 Problem] 언리얼 메모리 부족 문제 - "C3859 : PCH에 대한 가상 메모리를 만들지 못했습니다."

세동네·2022년 10월 9일
0
post-thumbnail

해당 오류는 내부 힙이 가득 차 미리 컴파일된 헤더를 의미하는 PCH(Pre-Compiled Header)에 할당된 가상 메모리가 너무 작아 충분히 많은 데이터를 헤더에 넣지 못할 때 발생하는 문제이다.

PCH에는 주로 큰 헤더 파일이나 다른 많은 헤더 파일을 포함하는 헤더 파일, 많은 번역 단위에 포함된 헤더 파일 등에 적용할 때 컴파일 시간을 크게 줄일 수 있다.

이 문제가 발생했을 때 /Zm 옵션을 활용하는 것을 많이 볼 수 있는데, MS에서 공식적으로 권장하는 설정은 #pragra hdrstop 지시문을 활용하고 있을 때 /Zm을 활용하고, 일반적인 경우는 메모리를 일정 크기의 가상 메모리로 나눠(페이징) 할당하는 단위를 크게 만들어주는 것이 좋다.

· 가상 메모리

일반적으로 애플리케이션이 실행될 때 애플리케이션이 필요로 하는 모든 메모리를 주 기억 장치에서 할당해주지 않는다. 메모리에 프로세스 전체가 올라가지 않더라도 실행이 가능하기 때문에, 필요한 부분만 메모리에 올리고 나머지 부분은 보조 기억 장치에 올려 놓고 필요할 때 메모리로 가져간다.

이때 애플리케이션이 올라간 빠른 주 기억 장치의 일부분과, 당장 메모리에 올릴 필요 없는 애플리케이션의 나머지를 저장한 보조 기억 장치의 공간을 마치 하나인 것처럼 동작하게 만든 것이 '가상 메모리'이다. 이러한 가상 메모리가 만들어지기 위해선 특수 메모리 관리 하드웨어가 필요하고, 이것이 MMU(Memory Management Unit)다.

각 가상 메모리는 가상 주소를 가지게 되고, 이는 물리 주소로 변환되어야 CPU에서 접근이 가능하다. 하지만 메모리를 일일이 가상 주소에서 물리적 주소로 번역하게 되면 부하가 너무 높아져 RAM을 여러 부분(페이지, Pages)으로 나누어 각 페이지를 하나의 독립된 항목으로 처리한다. 페이지를 나누는 과정을 페이징(Paging)이라 하고, 이러한 페이징과 주소 번역 정보를 기억하는 작업이 가상 메모리를 구현하는 데 있어 매우 중요한 절차이다.

이러한 가상 메모리 구현을 효율적으로 처리하기 위해선 작업량을 줄여야 할 것이고, 가장 대표적인 방법은 페이지 수를 줄여 주소 번역 작업 자체를 줄이는 것이다. 따라서 페이지 크기를 늘려 번역할 페이지 수를 줄이는 작업은 큰 도움이 된다.

· (해결법) 가상 메모리 크기 변경

Windows 기준 [설정 - 정보 - 우측 관련 설정 고급 시스템 설정 항목의 고급 탭 - 성능 설정 옵션의 고급 탭 - 가상 메모리 변경 옵션]에서 페이징 파일 크기를 설정할 수 있다.

만약 모든 드라이브에 대한 페이징 파일 크기 자동 관리 옵션이 활성화되어 있다면 이를 해제하고 사용자 지정 크기에서 처음 크기최대 크기를 변경해준다. MS에서는 페이징 파일 크기의 권장은 처음 크기는 '시스템에 설치된 물리적인 메모리의 1.5배', 최대 크기는 '시스템에 설치된 물리적인 메모리의 3배'라고 한다.

필자는 16GB의 램을 사용 중이어서 처음 크기는 권장 크기를 살짝 초과하지만, 일부 사용자의 말로는 처음 크기와 최대 크기를 일치시키는 것이 좋다고 하여 2배의 페이징 파일 크기를 설정하였다. 사용하면서 문제가 생긴다면 다시 변경할 것이고, 당분간 해당 설정을 유지할 것이다.


· 참고

[Wikipedia] 미리 컴파일된 헤더
[MS Document] 컴파일러 오류 C3859
[MS Document] /Zm (미리 컴파일된 헤더 메모리 할당 제한 지정)
#pragra hdrstop 에 대하여
가상 메모리(Virtual Memory System)
[MS Community] 가상 메모리 크기 설정 방법

0개의 댓글