대용량(390만 obs) data.frame을 텍스트 파일로 내보내는 가장 효율적인 방법은 무엇입니까?[복제하다]

StackOverflow https://stackoverflow.com//questions/9703068

  •  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로의 인터페이스를 제공합니다.

내 정보를 확인하는 과정에서 제가 유출되었다는 사실을 알려드립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top