2012-05-26 9 views
4

저는 9 열의 data.frame (x)을 가지고 있으며 수백만 개의 행이 있습니다. 나는 그것을 R로 읽어 들일 수 있었고, 성공적으로 수정을 가하면 코드는 문제없이 실행될 것이다. 그러나, 나는 때write.csv를 사용하는 동안 메모리 오류가 발생했습니다.

write.csv(x,file=argv[2],quote=F,row.names=F) 

내가 데이터가 메모리에 이미 같은이 말이 안

Error: cannot allocate vector of size 1.2Gb 

라는 오류가 발생하여 .csv 파일로 그것을 밖으로 쓰기는 계산 완료 , 그리고 내가하고 싶은 것은 디스크에 그것을 쓰는 것뿐입니다. 또한 메모리를 모니터링하는 동안 가상 메모리 크기는이 쓰기 단계 동안이 프로세스에서 거의 두 배가됩니다. 이 data.frame 도움을 작성하는 사용자 지정 C 함수를 작성하겠습니까? 어떤 제안/도움/포인터 감사.

ps : 저는 약 24G RAM이 장착 된 64 비트 우분투 상자에서이 모든 것을 실행하고 있습니다. 전반적인 공간이 문제가되지 않을 수도 있습니다. 데이터 크기는 약 10G입니다

+2

가장 간단한 방법은'append = TRUE'를 사용하여 작은 조각으로 파일에 작성하는 것입니다. 제쳐두고, 컴퓨터에 설치된 총 RAM은 메모리 문제가 있는지 여부를 나타내는 잘못된 표시 일 수 있습니다. R은 특정 크기의 메모리 블록을 자주 필요로하기 때문입니다. 24Gb를 사용하더라도 10 개의 인접한 Gb 메모리를 찾는 것이 때때로 어려울 수 있습니다. – joran

+0

@joran이 말한 바. 즉시'gc()'를 시도 할 수는 있지만,별로 도움이되지는 않습니다. –

+1

.RData 이미지로 개체를 저장하고 새 세션에서로드 할 수 있습니다. 어떤 이유로 계산 후 객체보다 메모리를 덜 소모합니다. 이 트릭을 때로는 메모리 문제가 발생할 때 사용합니다. –

답변

9

R 함수는 인수로 전달 된 객체를 변경하지 않는 R 명령에 의해 사용되는 함수 프로그래밍 패러다임으로 R 함수가 종종 인자를 복사한다는 점을 알아야합니다. 그래서 R은 함수를 실행하는 과정에서 변경이 필요할 때이를 복사합니다.

메모리 추적 지원을 사용하여 R을 빌드하면 문제가있는 작업에 대해이 복사 작업을 볼 수 있습니다. 내가

> head(airquality) 
    Ozone Solar.R Wind Temp Month Day 
1 41  190 7.4 67  5 1 
2 36  118 8.0 72  5 2 
3 12  149 12.6 74  5 3 
4 18  313 11.5 62  5 4 
5 NA  NA 14.3 56  5 5 
6 28  NA 14.9 66  5 6 
> tracemem(airquality) 
[1] "<0x12b4f78>" 
> write.csv(airquality, "airquality.csv") 
tracemem[0x12b4f78 -> 0x1aac0d8]: as.list.data.frame as.list lapply unlist which write.table eval eval eval.parent write.csv 
tracemem[0x12b4f78 -> 0x1aabf20]: as.list.data.frame as.list lapply sapply write.table eval eval eval.parent write.csv 
tracemem[0x12b4f78 -> 0xf8ae08]: as.list.data.frame as.list lapply write.table eval eval eval.parent write.csv 
tracemem[0x12b4f78 -> 0xf8aca8]: write.table eval eval eval.parent write.csv 
tracemem[0xf8aca8 -> 0xca7fe0]: [<-.data.frame [<- write.table eval eval eval.parent write.csv 
tracemem[0xca7fe0 -> 0xcaac50]: [<-.data.frame [<- write.table eval eval eval.parent write.csv 

를 참조 메모리 사용을 추적의 airquality 예를 들어, 데이터 세트를 사용하는 것은 그래서 R이 파일에 쓰기 위해 그것을 준비하는 데이터의 6 개 사본이 만들어지고 나타냅니다.

확실히 24GB RAM을 먹고 있습니다. 오류가 발생하면 작업을 완료하려면 1.2Gb RAM이 필요합니다.

가장 간단한 해결책은 파일을 청크로 작성하는 것입니다. append = FALSE을 사용하여 첫 번째 데이터 행 집합을 작성한 후 append = TRUE을 사용하여 나머지 청크를 작성하는 write.csv()을 호출합니다. 사용 가능한 메모리를 초과하지 않는 청크 크기를 찾으려면이 문제를 해결해야 할 수도 있습니다.

+3

첫 번째 청크 뒤에'col.names = FALSE'를 설정하여 출력 파일의 중간에 열 이름이 생기지 않도록하고 싶을 수도 있습니다. – Chase

+1

좋아, 할 수있는 유일한 방법 같아요 @ 죠란과 당신이 언급. 파일을 작은 청크로 잘라서 추가 모드에서 하나씩 차례대로 작성하십시오. – broccoli

+0

@broccoli 나는 그것을 가장 단순한 것으로 언급했다. 큰 데이터로 일상적으로 일하는 경우 매우 큰 데이터로 작업하기 쉽도록 ** ff ** 또는 ** bigmemory ** 패키지를 탐색하면 도움이 될 수 있습니다. 필자는 익숙하지 않지만 대형 객체를 파일로 작성하기위한 전용 함수가있을 수 있습니다. – joran

관련 문제