대용량(390만 obs) data.frame을 텍스트 파일로 내보내는 가장 효율적인 방법은 무엇입니까?[복제하다]
-
13-12-2019 - |
문제
SPSS로 내보내고 싶은 상당히 큰 데이터 프레임이 R에 있습니다.이 파일은 처음에 R로 가져오려고 몇 시간 동안 골치 아픈 일을 겪었지만 다음을 사용하여 성공했습니다. read.fwf()
옵션을 사용하여 comment.char="%"
(파일에 나타나지 않는 문자) 및 fill= TRUE
(일부 행에 모든 변수가 부족하여 오류 메시지가 발생하는 고정 너비 ASCII 파일이었습니다.)
어쨌든 내 데이터 프레임은 현재 3,9개의 관측치와 48개의 변수(모두 문자)로 구성되어 있습니다.4 x 1 밀 obs 세트로 분할하여 상당히 빠르게 파일에 쓸 수 있습니다. df2 <- df[1:1000000,]
이어서 write.table(df2)
등이 있지만 컴퓨터가 작동을 멈추고 다시 작동하기 위해 하드 리셋이 필요하지 않으면 한 번에 전체 파일을 쓸 수 없습니다.
수년간 R이 대규모 데이터 세트에 적합하지 않다는 일화를 들은 후 실제로 이런 종류의 문제에 직면한 것은 이번이 처음입니다.다른 접근법(파일을 디스크에 직접 "덤핑"하는 낮은 수준)이 있는지 또는 이러한 유형의 대용량 파일 내보내기를 효율적으로 처리할 수 있는 알려지지 않은 패키지가 있는지 궁금합니다.
해결책
추측컨대, 컴퓨터의 RAM이 부족하여 R이 스왑 파일을 사용해야 하므로 속도가 느려집니다.코드에 대한 대가를 받고 있다면 더 많은 RAM을 구입하는 것이 새 코드를 작성하는 것보다 더 저렴할 것입니다.
즉, 몇 가지 가능성이 있습니다.파일을 데이터베이스로 내보낸 다음 해당 데이터베이스의 기능을 사용하여 텍스트 파일에 쓸 수 있습니다.JD Long의 답변 이 질문 이런 방식으로 파일을 읽는 방법을 알려줍니다.프로세스를 되돌리는 것은 그리 어렵지 않습니다.대안적으로 bigmemory
그리고 ff
패키지(Davy가 언급한 대로)를 사용하여 이러한 파일을 작성할 수 있습니다.
다른 팁
1) 파일이 모두 문자열이면 다음을 사용하여 저장합니다. write.table()
먼저 그것을 matrix
.
2) 또한 1000000행의 덩어리로 작성하지만 항상 동일한 파일에 작성하고 인수를 사용합니다. append = TRUE
.
업데이트
Matt Dowle의 광범위한 작업을 통해 병렬화 및 기타 효율성 개선 사항을 추가한 후, fread
지금은 이전보다 15배 더 빠릅니다. write.csv
.자세한 내용은 연결된 답변을 참조하세요.
지금 data.table
가지고있다 fwrite
Otto Seiskari가 기여한 기능은 다음보다 약 두 배 빠른 것으로 보입니다. write.csv
일반적으로.보다 여기 일부 벤치마크의 경우.
library(data.table)
fwrite(DF, "output.csv")
행 이름은 제외됩니다. data.table
유형은 이를 사용하지 않습니다.
매우 큰 파일(10GB 이상)을 읽는 데에만 사용하지만 ff
패키지에는 매우 큰 df를 작성하는 기능이 있습니다.
글쎄, 매우 큰 파일과 R에 대한 대답은 종종 그렇듯이 이러한 종류의 작업을 데이터베이스로 오프로드하는 것이 가장 좋습니다.SPSS에는 ODBC 연결이 있으며 RODBC
R에서 SQL로의 인터페이스를 제공합니다.
내 정보를 확인하는 과정에서 제가 유출되었다는 사실을 알려드립니다.