将文件读入 R 比 while{rbind(read.table)} 更快

Read files into R faster than while{rbind(read.table)}

我正在将大量 Apache 日志文件读入 R。这些文件的名称都是 "logfile_" 加上它们的日期,例如logfile_2019-12-30。以下是我阅读文件的方式:

path <- "/path/to/logs/"

beginning <- as.Date("2019-12-01", format="%Y-%m-%d")
ending <- as.Date("2019-12-31", format="%Y-%m-%d")

d <- beginning
dat <- data.frame()
while (d < ending)
{
    dat <- rbind(dat, read.table(paste0(path, "logfile_", d), stringsAsFactors = FALSE))
    d <- d + 1                    
}

一个月(大约一百万行日志条目),while-loop 执行大约需要四分钟。我想阅读和处理几年的文件,但不想等待数小时。

如何更高效、更快速地读取文件?

您可以使用序列函数创建一个日期向量,然后在 read.table 中使用该向量,如下所示;

path <- "/path/to/logs/"

beginning <- as.Date("2019-12-01", format="%Y-%m-%d")
ending <- as.Date("2019-12-31", format="%Y-%m-%d")

file_names <- paste0(path, "logfile_", seq(beginning, ending ,by = 1))
do.call(rbind, lapply(file_names, read.table, stringsAsFactors = FALSE))

使用 data.table::rbindlistfread

应该会更快
library(data.table)
beginning <- as.Date("2019-12-01")
ending <- as.Date("2019-12-31")

out <- rbindlist(lapply(paste0(path, "logfile_", 
                 seq(beginning, ending, by = "1 day")), fread))

或者你也可以使用dplyr::bind_rows

out <- dplyr::bind_rows(lapply(paste0(path, "logfile_", 
      seq(beginning, ending, by = "1 day")), read.table, stringsAsFactors = FALSE))