将文件读入 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::rbindlist
和 fread
应该会更快
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))
我正在将大量 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::rbindlist
和 fread
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))