【问题标题】:Parallelize read of 500 independent small .rds files into a singe data.frame将 500 个独立的小型 .rds 文件并行读取到单个 data.frame 中
【发布时间】:2017-12-20 09:39:21
【问题描述】:

类似的 Q 可能是 R: Applying readRDS to a list object of .Rds file names,但是,该解决方案并不比我的 for loop 更有效。

在一个文件夹中,我存储了500.rds files,命名为file_1.rdsfile_2.rds、...、file_500.rds
每个文件都包含大约200 records6 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,因此我愿意改进write 流程,例如保存.csv 或任何其他比.rds 更有效的阅读格式。

【问题讨论】:

  • 使用parallel::mclapply怎么样?对于写入过程,您可以签出fstgithub.com/fstpackage/fst/blob/develop/README.md。另外,我会将文件读入一个列表,并且只一次使用data.table::rbindlist 将它们组合成一个表。
  • 您是否建议在parallel::mclapply 中使用data.table::rbindlist?就写入而言,每个file_x都是一个长而复杂的函数的一次迭代的结果,因此,我唯一关心的是改变file_x的扩展名,以改进以下读取先前获得的所有块的过程
  • 不,我建议使用parallel::mclapply 仅读取文件(并行化),然后之后在结果列表上运行单个 rbindlist。

标签: r rds


【解决方案1】:

我找到了使用purrr的解决方案。
问题是有数千个.rds 文件要读取parallelized,我需要使用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")

【讨论】:

  • 这是如何平行的?从您的代码中不清楚。它似乎是连续的。
猜你喜欢
  • 2012-06-21
  • 2021-12-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2018-04-22
相关资源
最近更新 更多