HOWTO · R
R에서 메모리 늘리기
이 튜토리얼은 R에서 메모리를 늘리는 방법을 보여줍니다.
이 페이지의 내용
R에서 메모리를 할당할 수 없다는 오류가 발생하면 먼저 컴퓨터에서 사용할 수 있는 메모리와 R 프로세스에 적용되는 제한을 구분하세요. R은 시스템이 제공할 수 있는 물리 메모리보다 더 많이 사용할 수 없으며, 운영체제나 컨테이너가 자체 리소스 제한을 적용할 수도 있습니다. R 설정은 해당 설정이 지원되는 경우 프로세스 제한을 바꿀 수 있지만 RAM을 추가하거나 특정 분석에 필요한 메모리가 충분하다고 보장하지는 않습니다.
사용할 수 있는 제어 방법은 R 버전, 운영체제, R을 실행하는 방식에 따라 다릅니다. 설정을 적용하기 전에 설치된 버전의 시작 관련 문서를 확인하세요. 정확한 오류 메시지를 기록하고 작업에서 가장 큰 객체와 메모리를 많이 쓰는 연산을 파악하세요. 이 정보는 주된 제약이 설정인지, 데이터 크기인지, 중간 복사본인지 판단하는 데 도움이 됩니다.
R 메모리 사용을 제한하는 요인 이해하기
R 프로세스는 객체, 임시 결과, 패키지, 런타임 오버헤드에 메모리를 사용합니다. 테이블을 조인하거나 데이터를 재구성하거나 형식을 변환하는 작업은 원본 객체가 메모리에 남아 있는 동안 추가 메모리를 필요로 할 수 있습니다. 따라서 디스크에는 들어가는 데이터셋도 계산 중에는 훨씬 더 많은 메모리를 요구할 수 있습니다.
모든 제한을 나타내는 단일한 “R 메모리” 값은 없습니다. 물리 RAM, 사용 가능한 스왑 또는 가상 메모리, 프로세스 주소 공간, R 전용 힙 제한은 서로 다른 제약입니다. 어떤 제약이 적용되는지는 운영체제와 R 빌드에 따라 달라집니다. R 전용 제한을 높여도 시스템 제한을 넘을 수는 없으며, 제한을 높이면 다른 프로그램에 필요한 리소스까지 프로세스가 사용할 수 있습니다.
Windows에서 R 메모리 늘리기
설치된 버전에서 사용할 수 있는지 확인하지 않은 채 이전 R 릴리스의 Windows 바로 가기 설정 방법을 그대로 적용하지 마세요. R 콘솔에서 R.version.string을 확인한 다음 해당 버전의 시작 관련 도움말에서 지원되는 옵션을 확인하세요. R 명령줄 설명서에는 시작 옵션이 설명되어 있습니다. 설치된 버전의 문서에서 --max-vsize를 지원한다면, R을 실행하는 명령에 문서에 나온 값을 추가하세요. 바로 가기에서는 Rgui.exe의 경로를 따옴표로 묶은 뒤 닫는 따옴표와 옵션 사이에 공백을 넣어 옵션을 덧붙이면 됩니다. 기존 실행 파일 경로와 필요한 다른 인수는 그대로 유지하세요.
Windows의 속성 창에서 대상(Target)을 수정하면 해당 바로 가기가 R을 시작하는 방식이 바뀝니다. 컴퓨터의 물리 메모리가 늘어나는 것은 아닙니다. RStudio를 사용하는 경우 Rgui.exe 바로 가기를 바꿔도 RStudio가 시작하는 R 세션에는 설정이 적용되지 않을 수 있습니다. 실제로 해당 세션을 시작하는 실행 프로그램을 설정하고, 시작 설정이 적용되도록 세션을 다시 시작하세요. 관리자 권한으로 실행하면 지원되지 않는 옵션도 작동할 것이라고 가정하지 마세요.
R을 실행할 때 지원되는 제한 설정하기
R 버전과 플랫폼에 맞는 것으로 문서에 명시된 시작 옵션이나 환경 변수만 사용하세요. R 관리 설명서의 환경 변수 항목에는 R_MAX_VSIZE가 설명되어 있습니다. 시작 옵션은 R 명령줄 설명서에서 함께 확인하세요. 설치된 버전의 문서에 --max-vsize와 R_MAX_VSIZE가 나와 있다면 이를 사용해 벡터 힙을 설정할 수 있습니다. 그렇지 않다면 해당 이름이 지원된다고 가정하지 마세요. 값은 크기를 나타내며, 허용되는 표기법과 단위는 해당 문서를 따라야 합니다. 시작 환경 변수는 R을 실행하기 전에 설정하세요. 이미 실행 중인 세션에서 값을 바꿔도 그 세션이 다시 설정되지는 않습니다.
POSIX 셸에서 한 번만 설정해 실행하는 형식은 R_MAX_VSIZE=value R입니다. 여기서 value에는 설치 환경의 문서에 나온 표기법을 사용해야 합니다. 이는 형식의 예일 뿐, 그대로 복사해 적용할 수 있는 메모리 제한 값이 아닙니다. Windows에서는 문서화된 변수를 R을 실행하는 환경에 설정하거나 해당 실행 프로그램에 문서화된 옵션을 전달하세요. R_MAX_MEM_SIZE, --max-mem-size, ulimit -v가 R의 벡터 힙을 제어한다고 가정하지 마세요. 지원 여부와 효과는 플랫폼과 릴리스마다 다르며, 운영체제 제한은 프로세스를 제한할 수도 있습니다.
gc()로 사용하지 않는 객체의 메모리 회수하기
R은 더 이상 도달할 수 없는 객체가 차지한 메모리를 회수할 수 있습니다. 큰 객체를 더 이상 사용할 필요가 없으면 해당 객체를 가리키는 참조를 제거하세요. gc()는 가비지 컬렉션을 요청하고 메모리 통계를 표시합니다. 아직 참조 중인 객체를 회수하거나 프로세스 제한을 높이지는 않으며, R이 반환한 메모리가 운영체제에서 즉시 사용 가능한 메모리로 표시된다고 보장하지도 않습니다.
다음 예제를 실행하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
values <- seq_len(100000)
total <- sum(values)
rm(values)
gc()
print(total)
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 273719 14.7 660948 35.3 452023 24.2
Vcells 459142 3.6 8388608 64.0 1800334 13.8
[1] 5000050000
가비지 컬렉션 통계는 R 빌드와 세션에 따라 달라집니다. 이 예제에서 안정적으로 확인할 수 있는 결과는 출력되는 합계입니다. 일반적인 스크립트에서는 R이 필요에 따라 가비지 컬렉션을 수행하므로, 모든 연산 뒤에 gc()를 호출해도 대개 유용하지 않고 오히려 작업이 늘어날 수 있습니다. 다른 곳에서 더 이상 필요하지 않을 때만 rm() 호출을 유지하세요.
변경 사항 확인 및 남은 메모리 부족 오류 진단하기
시작 옵션이나 환경 변수를 변경한 뒤에는 새 R 프로세스를 시작하세요. R.version.string으로 설치된 버전을 확인하고 gc()를 살펴 현재 힙 통계를 확인하세요. 관찰한 설정이나 통계를 해당 버전의 문서와 비교하세요. R이 문제없이 실행되었다는 사실만으로 요청한 제한이 적용되었다고 단정할 수는 없습니다. 운영체제가 메모리 할당을 막을 수 있으므로 시스템 메모리도 확인하세요.
memory.limit()는 Windows 전용 레거시 함수입니다. 현재 R-devel utils 메모리 제한 문서는 이 함수가 폐기된 상태(defunct)라고 표시합니다. 사용 중인 릴리스에도 이 상태가 적용된다면 메모리를 늘리기 위해 이 함수를 사용하지 마세요. 이전 릴리스를 사용한다면 이 함수에 의존하기 전에 해당 릴리스의 도움말을 확인하세요. 이 함수는 모든 플랫폼에 적용되는 일반 설정이 아닙니다. 관리자 권한으로 RStudio나 R을 실행해도 함수가 폐기된 상태에서 지원이 되살아나지는 않습니다.
오류가 계속되면 전체 오류 메시지, R 버전, 플랫폼, 실행 프로그램, 실패한 작업을 기록하세요. 큰 임시 복사본이 있는지 확인하고, 더 이상 필요하지 않은 객체를 제거하거나 데이터를 청크 단위로 처리하거나 전체 데이터를 한꺼번에 불러오지 않는 표현 방식을 사용해 보세요. 시스템 리소스가 충분하고 관련 문서에서 해당 옵션을 확인한 경우에만 지원되는 벡터 힙 제한을 높이는 방안을 고려하세요. 어떤 제한 설정도 모든 작업에서 메모리 부족 오류가 사라진다고 보장할 수 없습니다.