2012-04-10 4 views
2

나는 4GB의 RAM을 가지고 있으며 오류 메시지 I 'm getting : Error: cannot allocate vector of size 147.6 Mb에 따라 Linux에서 R의 메모리로 147.6MB를 가져 오는 데 문제가 있습니다.data.frames를 병합하면 메모리 부족 오류가 발생합니다.

어떻게 진단 할 수 있습니까?

IDs <- read.csv('Set1.csv') # 2 MB 
Set2 <- read.csv('Set2.csv') # 240 MB 
data <- merge(IDs, Set2, by='MemberID') 
rm(IDs)      # Remove junk! 
rm(Set2)      # Remove junk! 
gc() 
print('First merge complete') 

Set3 <- read.csv('Set3.csv') # 25 MB 
data <- merge(data, Set3, by='MemberID') 
rm(Set3)      # Remove junk! 
gc() 
print('Second merge complete') 

실행은 첫 번째 인쇄 문 뒤에 정지 :

여기 내 코드입니다. 여분의 메모리 사용량이 어디에서 오는지 이해할 수 없습니다. R의 memory() 문서를 살펴보면 연속적인 메모리 문제 인 것 같습니다. 우분투에서이 문제를 해결할 방법이 있습니까?

비슷한 질문을하는 다른 사람들을 살펴 보았지만 제안 된 솔루션은 Windows 관련 항목이었습니다.

EDIT 1

일부 의견은 아래의 코멘트를 해결하기 위해 : 개체가 CSV에서 읽을에서 너무 많은 크기를 변경하는 것처럼

> print(object.size(IDs), units="Mb") 
1.3 Mb 
> print(object.size(Set2), units="Mb") 
142.6 Mb 
> print(object.size(Set3), units="Mb") 
12.5 Mb 

그래서, 그것은 보이지 않는다. 나는

편집 내가 data.table()를 사용하고 동일한 오류가 내 코드를 업데이트 한 2

... data.table()와 나머지에 위로를 확인합니다. 이것은 어쩌면 그것이 내 컴퓨터에 어떻게 든 특별한 것이라고 우려하게 만들 수 있습니까? 이것은 단지 관련 파일의 크기가 매우 이상하게 보입니다. Error: cannot allocate vector of size 147.6 Mb

IDs <- as.data.table(read.csv('Set1.csv')) # 2 MB 
Set2 <- as.data.table(read.csv('Set2.csv')) # 240 MB 
data <- merge(IDs, Set2, by='MemberID') 
rm(IDs)      # Remove junk! 
rm(Set2)      # Remove junk! 
gc() 
print('First merge complete') 

Set3 <- as.data.table(read.csv('Set3.csv')) # 25 MB 
data <- merge(data, Set3, by='MemberID') 
rm(Set3)      # Remove junk! 
gc() 
print('Second merge complete') 

(3) 내 데이터를 검사 편집, 나는 문제가 여기에있을 수있다 생각한다. Set3.csv에는 몇 가지 공통 필드 이름이 있으므로 nx n 조인 등의 불쾌한 일을하고 있다고 생각합니다.

+3

당신은 어딘가에 [The R Inferno] (https://www.google.com/url?q=http://www.burns-stat.com/pages/)의 2 번째 서클이 무엇인지 생각하고 있습니다. 가정교사/R_inferno.pdf & sa = U & ei = gr-ET_f2Ms_TiAKs-fH1BA & ved = 0CBAQFjAA & usg = AFQjCNFYCWUrzMj_7SOwr-EJ9Gu34VOl_w).Merge는 매우 메모리 집약적인데, 만약 당신이'object.size'를 본다면 R로 읽어 들인 csv 파일은 그 파일보다 훨씬 클 것이라고 가정합니다. – Justin

+0

'data.table()'을 사용하면 더 좋았습니다. 대용량 데이터 객체를 병합하기 위해 메모리 관리 측면 에서뿐만 아니라 작업 수행 측면에서도 마찬가지입니다. – Chase

+0

그냥 잠깐 확인해보십시오. 새로운 R 세션에 맞습니까? – jimmyb

답변

0

@Chase가 data.table()으로 바뀌고 위의 설명에서 제안한 바와 같이 사용 된 개체를 삭제하면 첫 번째 병합을 처리 할 수있게되었습니다. 나중에 문제가되는 병합은 실제로 고유하지 않은 키를 갖는 두 번째 데이터 세트로 인해 예상하지 못한 어딘가에 직교 결합을 수행했기 때문에 완전히 삭제해야했습니다.

일시적으로 데이터를 부분 집합하여이 문제가 해결되었지만 나중에 모델을 예측에 적용하려고 할 때 비슷한 오류가 발생했습니다.

이야기의 도덕적 의미는 R 함수가 위의 @Justin에 의해 제안 된대로 들어오는 벡터 자체의 크기보다 훨씬 많은 메모리를 사용한다는 것입니다.이 숫자는 object.size으로 측정됩니다. 처리 작업 중 RAM이 부족한 기능에 대해서도 마찬가지입니다.

0

나는 매우 비슷한 문제가있었습니다. 문제는 두 데이터 프레임의 "by"열에 NA를 도입했기 때문입니다.

끝에 큰 데이터 프레임이 발생했습니다. NA로 행을 수정하거나 제거하면 문제가 해결됩니다.

관련 문제