在R中高效读取大量小文件

问题描述 投票:0回答:2

我有大约 700K 个小文件(condor 日志文件,小于 10 KB)。文件名没有规则。我使用 list.files 获取所有文件名,然后使用 readLines 读取它们,并将它们合并为列表。

目前读取所有文件需要几个小时。这些是我读取日志文件的代码。

rm(list = ls())

base <- 'logs-025'
exts <- c('log', 'out', 'err')

for (i in seq(along = exts))
{
    all_files <- list.files(base, paste0('apsim_.*.', exts[i]), full.names = TRUE)
    res <- NULL
    for (j in seq(along = all_files))
    {
        res_j <- readLines(all_files[j])
        res[[j]] <- res_j
    }
    save(res, file = paste0(Sys.info()['nodename'], '-', exts[i], '.RData'))
}

R中有没有一种有效的方法来读取大量小文件?

感谢您的任何建议。

干杯, 邦佑

r
2个回答
1
投票

根据数据集的总大小(即是否适合内存),您可能需要对文件进行内存映射(例如使用 ff 包

但总的来说,R 的 IO 函数的性能很差,我建议用 C 编写这些循环


0
投票

这有点晚了,但它可能会对将来的人们有所帮助......

回答帖子中的问题:您可以考虑来自

ldply
库的
plyr
。 当然有一个更新、更高效的选项,但与 for 循环相比,这个选项显着加快了许多小文件的加载时间:

library("plyr")
a_table <- ldply(file_path_list, function(x){
   path <- x
   line <- readLines(path)
   return(line)
})

假设您有一个列表 (

file_path_list
),其中包含各个文件的所有路径。

© www.soinside.com 2019 - 2024. All rights reserved.