首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在单个data.frame中并行读取500个独立小.rds文件

在单个data.frame中并行读取500个独立小.rds文件
EN

Stack Overflow用户
提问于 2017-12-20 09:39:21
回答 1查看 326关注 0票数 1

一个类似的Q可能是R: Applying readRDS to a list object of .Rds file names,然而,该解决方案并不比我的for loop效率高很多。

在一个文件夹中,我存储了名为file_1.rdsfile_2.rds,...,file_500.rds500 .rds files

每个文件包含大约200 records6 variables,它们是一个大data.frame的小块。

代码语言:javascript
运行
AI代码解释
复制
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更高效的格式。

EN

回答 1

Stack Overflow用户

发布于 2018-02-12 08:37:29

我找到了一个使用purrr的解决方案。

问题是有数以千计的.rds文件要读取parallelized,我需要使用loop来并行读取小块。

否则,我会收到一个内存错误,进度就会丢失。

代码语言:javascript
运行
AI代码解释
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47902916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档