2017-12-20 4 views
1

비슷한 Q가 R: Applying readRDS to a list object of .Rds file names 일 수 있지만 그 해결책은 내 for loop보다 훨씬 효율적이지 않습니다.500 개의 독립적 인 작은 .rds 파일을 단일 데이터로 병렬화하십시오. 프레임

하나 개의 폴더에, 나는 500.rds files라는 이름으로 file_1.rds, file_2.rds, ..., file_500.rds을 저장했다.
각 파일의 크기는 및 6 variables입니다.이 파일은 큰 크기의 작은 청크 인 data.frame입니다.

mydf <- data.frame() 
for (m in 1 : 500) { 
     temp <- readRDS(paste0("H://myfolder//file_",m, ".rds")) 
     mydf<- rbind(mydf, temp) 
} 

코드를보다 효율적으로 접근하거나 개선하는 방법에 대한 의견이 있으십니까?
또한 500 .rds files을 만들었으므로 .csv에 저장하거나 .rds보다 훨씬 효율적으로 읽을 수있는 형식으로 저장하여 write 프로세스를 개선 할 수 있습니다.

+1

'parallel :: mclapply'을 사용하는 것은 어떻습니까? 쓰기 과정에서'fst' 패키지 https://github.com/fstpackage/fst/blob/develop/README.md를 체크 아웃 할 수 있습니다. 게다가, 나는 파일을 목록으로 읽어 들였을뿐 * 한 번만'data.table :: rbindlist'를 사용하여 단일 테이블로 결합했습니다. –

+0

'parallel :: mclapply'에서'data.table :: rbindlist'를 사용 하시겠습니까? 지금까지 write와 관련하여 각 file_x는 길고 복잡한 함수를 한 번 반복 한 결과이므로 이전에 얻은 모든 청크를 읽을 때 다음 프로세스를 향상시키기 위해 file_x의 확장을 변경하는 것과 관련된 유일한 문제는 – Seymour

+2

아니요,'parallel :: mclapply'를 사용하여 (병렬 처리 된) 파일을 읽고 나중에 * 결과 목록에서 단일 rbindlist를 실행하는 것이 좋습니다. –

답변

0

purrr을 사용하는 해결책을 발견했습니다.
parallelized을 읽으려면 수천 개의 .rds 개의 파일이 필요하므로 병렬로 작은 청크를 읽으려면 loop을 사용해야합니다.
그렇지 않으면 메모리 오류가 발생하고 진행 상황이 손실됩니다.

mydf<- readRDS("H://folder//mydf.rds") 
#Create a vector of string with the names of all rds files to read 
rds <- paste0("H://folder//myrds", 1:3870, ".rds") 
#Determine the number of iteration to read the files in chunks by 200 each 
n <- ceiling(length(rds)/200) 
m <- 1 
library(purrr) 
while (m <= n) { 
#if the loop is **not** in the last iteration 
     if(m < n) { 
       rds_temp <- paste0("H://folder//myrds", (200*(m-1)+1):(200*m), ".rds") 
       temp <- purrr::map_df(rds_temp, readRDS) 
       mydf<- rbind(mydf, temp) 
#if the loop **is** in the last iteration 
     } else if(m == n) { 
       rds_temp <- paste0("H://folder//myrds", (200*(m-1)+1):(length(rds)), ".rds") 
       temp <- purrr::map_df(rds_temp, readRDS) 
       mydf<- rbind(mydf, temp) 
     } 
     rm(temp) 
     gc() 
     print(m) 
     m <- m + 1 
} 
saveRDS(mydf, "H://folder//mydf.rds") 
관련 문제