我有大约 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中有没有一种有效的方法来读取大量小文件?
感谢您的任何建议。
干杯, 邦佑
根据数据集的总大小(即是否适合内存),您可能需要对文件进行内存映射(例如使用 ff 包)
但总的来说,R 的 IO 函数的性能很差,我建议用 C 编写这些循环
这有点晚了,但它可能会对将来的人们有所帮助......
回答帖子中的问题:您可以考虑来自
ldply
库的 plyr
。 当然有一个更新、更高效的选项,但与 for 循环相比,这个选项显着加快了许多小文件的加载时间:
library("plyr")
a_table <- ldply(file_path_list, function(x){
path <- x
line <- readLines(path)
return(line)
})
假设您有一个列表 (
file_path_list
),其中包含各个文件的所有路径。