R 메모리 관리 / 크기 n Mb의 벡터를 할당 할 수 없음


149

R에서 큰 객체를 사용하는 데 문제가 있습니다. 예를 들면 다음과 같습니다.

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

나는 이것이 인접한 메모리 블록을 얻는 것이 어렵다는 것을 이해합니다 ( here ).

크기의 벡터를 할당 할 수없는 오류 메시지는 크기가 프로세스의 주소 공간 한계를 초과했거나 시스템이 메모리를 제공 할 수 없었기 때문에 메모리를 확보하지 못했음을 나타냅니다. 32 비트 빌드에는 사용 가능한 충분한 여유 메모리가있을 수 있지만이를 맵핑 할 수있는 충분히 인접한 주소 공간 블록은 없습니다.

이 문제를 어떻게 해결할 수 있습니까? 내 주요 어려움은 스크립트의 특정 지점에 도달하고 R이 객체에 200-300 Mb를 할당 할 수 없다는 것입니다. 다른 처리를 위해 메모리가 필요하기 때문에 실제로 블록을 미리 할당 할 수 없습니다. 불필요한 객체를 제거 할 때에도 마찬가지입니다.

편집 : 예, 죄송합니다 : Windows XP SP3, 4Gb RAM, R 2.12.0 :

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

사용되지 않은 다른 프로세스의 메모리를 할당 해제하려면 '무료'를 사용하십시오.
Manoel Galdino

5
@ Manoel Galdino : '무료'란 무엇입니까? R 함수?
Benjamin

3
@Manoel : R에서 메모리 비우기 작업은 사용자가 아닌 가비지 수집기에서 처리합니다. 는 C 레벨에서 작업하는 경우, 하나는 수동으로 할 수 CallocFree메모리,하지만 난이 베냐민하고있는 것이 아니다 생각한다.
Sharpie

라이브러리 XML에서는 무료로 사용할 수 있습니다. 문서에서 : "이 일반 함수는 주어진 오브젝트와 연관된 메모리를 명시 적으로 해제하기 위해 사용 가능합니다. 자동 종료 기능 / 루틴이없는 외부 포인터 오브젝트에 사용하기위한 것입니다. 기본 개체입니다. "
Manoel Galdino

답변:


78

이 데이터를 모두 명시 적으로 필요로하는지 또는 행렬이 희박 할 수 있는지 고려하십시오. Matrix희소 행렬에 대해 R에서 좋은 지원이 있습니다 ( 예 : 패키지 참조 ).

이 크기의 객체를 만들어야하는 경우 R의 다른 모든 프로세스와 객체를 최소로 유지하십시오. 사용 gc()하지 않는 메모리를 지우거나 한 세션에서 필요한 객체 만 만드는 것이 좋습니다. .

위의 방법으로 문제가 해결되지 않으면 RAM 용량이 충분한 64 비트 시스템을 구입하여 64 비트 R을 설치하십시오.

그렇게 할 수 없다면 원격 컴퓨팅을위한 많은 온라인 서비스가 있습니다.

그렇게 할 수 없다면 package ff(또는 bigmemorySascha가 언급 한) 와 같은 메모리 매핑 도구 가 새로운 솔루션을 구축하는 데 도움이됩니다. 제한된 경험으로 ff는 고급 패키지이지만 High Performance ComputingCRAN 작업보기에 대한 주제를 읽어야합니다 .


1
이 작업은 randomForest를 사용한 이미지 분류입니다. randomForest에 피드하려면 훈련 데이터 (최대 60 밴드)와 20,000 ~ 6,000,000 행의 매트릭스가 필요합니다. 결과적으로 randomForest 객체를 보유하기 위해 연속 블록이 필요하기 때문에 현재 약 150,000 행을 초과합니다. randomForest에 행렬 객체가 필요하므로 bigmemory가 도움이되지 않습니다.
Benjamin

"한 세션에서 필요한 개체 만 생성"이란 무엇입니까?
Benjamin

새 세션을 처음 시작할 때 'a'를 한 번만 작성하십시오
mdsumner

1
많은 계산이 수행되지만 출력이 비교적 작은 큰 루프를 포함하는 프로그램의 경우 Rscript를 통해 루프의 내부 부분을 호출하는 것이 더 메모리 효율적 일 수 있습니다 (BASH 또는 Python 스크립트에서) 이후에 다른 스크립트에서 결과를 수집 / 집계합니다. 이렇게하면 각 반복 후에 메모리가 완전히 해제됩니다. 루프에 전달 된 변수를 다시로드 / 재 계산하면 약간의 계산이 낭비되지만 적어도 메모리 문제를 해결할 수 있습니다.
Benjamin

54

Windows 사용자의 경우 다음은 일부 메모리 제한 사항을 이해하는 데 많은 도움이되었습니다.

  • R을 열기 전에 Windows 자원 모니터를여십시오 (Ctrl-Alt-Delete / 작업 관리자 시작 / 성능 탭 / 하단의 '자원 모니터'/ 메모리 탭 클릭).
  • R을 열기 전에 이미 사용한 RAM 메모리 양과 응용 프로그램을 확인할 수 있습니다. 필자의 경우 총 4GB 중 1.6GB가 사용됩니다. 따라서 R의 경우 2.4GB 만 얻을 수 있지만 이제는 더 나빠집니다 ...
  • R을 열고 1.5GB의 데이터 세트를 만든 다음 크기를 0.5GB로 줄이면 리소스 모니터에 RAM이 거의 95 % 사용 된 것으로 표시됩니다.
  • gc()가비지 수집을 수행 하는 데 사용 => 작동, 메모리 사용이 2GB로 감소 함을 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

내 컴퓨터에서 작동하는 추가 조언 :

  • 기능을 준비하고, RData 파일로 저장하고, R을 닫고, R을 다시 열고, 열차 기능을로드하십시오. Resource Manager는 일반적으로 메모리 사용량이 적다는 것을 의미합니다. 즉, gc ()조차도 가능한 모든 메모리를 복구하지 못하고 R을 닫거나 다시 열 때 사용 가능한 최대 메모리로 시작하는 것이 가장 좋습니다 .
  • 다른 방법은 훈련을 위해 기차 세트 만로드하는 것입니다 (테스트 세트는로드하지 마십시오. 일반적으로 기차 세트의 절반 크기 일 수 있습니다). 훈련 단계에서는 메모리를 최대 (100 %)까지 사용할 수 있으므로 사용 가능한 모든 것이 유용합니다. 이 모든 것은 R 메모리 한계를 실험하면서 소금 한 알을 섭취하는 것입니다.

9
R은 가비지 수집을 자체적으로 수행하며 gc()단지 환상 일뿐입니다. 작업 관리자 확인은 매우 기본적인 Windows 작업입니다. 내가 동의 할 수있는 유일한 조언은 .RData 형식으로 저장하는 것입니다
David Arenburg

3
@DavidArenburg gc ()는 환상입니까? 그것은 위에서 메모리 사용량 감소를 보여주는 그림이 환상이라는 것을 의미합니다. 나는 당신이 틀렸다고 생각하지만, 오해했을 수도 있습니다.
Timothée HENRY

4
나는 그것이 효과가 없다는 것을 의미 gc()하지는 않았다. R이 자동으로 수행하므로 수동으로 수행 할 필요가 없습니다. 참조 여기
데이비드 Arenburg에게

2
@DavidArenburg 위의 그림에서 메모리 사용량이 gc () 명령으로 인한 것임을 알 수 있습니다. 나는 당신이 가리키는 문서가 적어도 내 설정 (Windows, R 버전 3.1.0 (2014-04-10) 플랫폼 : i386-w64-mingw32 / i386 (32-bit)에는 맞지 않다고 생각합니다.
Timothée HENRY

15
좋아, 마지막으로. gc() 작동 합니다. R은 내부적으로하기 때문에 사용하지 않아도됩니다
David Arenburg


14

이 제한을 회피하는 가장 간단한 방법은 64 비트 R로 전환하는 것입니다.


25
그것은 일반적으로 치료법이 아닙니다. 전환했으며 이제는 Error: cannot allocate vector of size ... Gb대신했습니다 (그러나 예, 많은 데이터가 있습니다).
om-nom-nom

2
아마도 치료법은 아니지만 많은 도움이됩니다. RAM에로드하고 memory.limit ()를 계속 크랭크하십시오. 또는 데이터 파티셔닝 / 샘플링에 대해 생각해보십시오.
random_forest_fanatic

64 비트에서도 문제가 발생하면 본질적으로 무제한이며 실제로 거대한 것을 할당하려고 시도하는 것이 더 큽니다. 이론적으로 벡터가 얼마나 커야하는지 계산 했습니까? 그렇지 않으면 컴퓨터에 더 많은 RAM이 필요할 수 있지만 가질 수있는 용량이 너무 많습니다.
hangmanwa7id

더 많은 벽면 솔루션에 앞서 이와 같은 간단한 솔루션을 사용해보십시오. 감사.
Nova

또한 이것은 Windows에만 문제가되지 않습니다. 현재 Ubuntu에서 64 비트 R을 사용하고 있으며 Matrix를 사용하고 20048 x 96448 Matrix 객체를 조작하는 데 어려움이 있습니다.

12

비슷한 문제가 발생하여 2 개의 플래시 드라이브를 'ReadyBoost'로 사용했습니다. 두 개의 드라이브는 캐시를 위해 8GB의 메모리를 추가로 제공하여 문제를 해결하고 시스템의 전체 속도를 높였습니다. Readyboost를 사용하려면 드라이브를 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동하여 'ReadyBoost'를 선택하고 '이 장치 사용'라디오 버튼을 선택한 다음 적용 또는 확인을 클릭하여 구성하십시오.


11

memor.limit의 도움말 페이지를 따라 가서 내 컴퓨터 R에서 기본적으로 최대 1.5GB의 RAM을 사용할 수 있으며 사용자 가이 제한을 늘릴 수 있음을 알았습니다. 다음 코드를 사용하여

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

내 문제를 해결하는 데 도움이되었습니다.


1
이것이 왜 투표되지 않습니까? 확실히 위험한 접근 방법이지만 작동하기 위해 약간의 메모리를 세션에 할당 해야하는 경우 종종 도움이 될 수 있습니다.
Jeppe Olsen

3
이것은 Windows 전용 솔루션입니다
Jinhua Wang

9

Linux 환경에서 스크립트를 실행중인 경우 다음 명령을 사용할 수 있습니다.

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

서버는 요청 된 메모리를 할당합니다 (서버 제한에 따라 서버는 훌륭하지만 거대한 파일을 사용할 수 있음)


1
Amazon EC2 인스턴스에서이를 사용할 수 있습니까? 그렇다면 무엇을 대신 server_name해야합니까? 나는이로 실행하고 cannot allocate vector size...AMI는에 거대한 문서-기간 행렬을하려고로하고 충분한 메모리가없는 이유를 알아낼 수 없습니다, 또는 얼마나 더 나는 임대해야합니다. 감사합니다!
seth127

나는 우분투 초보자이며 Rstudio를 사용하고 있습니다. 16GB RAM이 있습니다. 답변에 표시 한 프로세스를 어떻게 적용합니까? 감사합니다
runjumpfly

3

위에서 언급 한 저장 /로드 방법이 저에게 효과적입니다. gc()메모리 조각 모음이 어떻게 / if 지 잘 모르겠지만 작동하는 것 같습니다.

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.