【发布时间】:2016-06-16 06:30:35
【问题描述】:
我有几十万个非常小的.dat.gz 文件,我想以最有效的方式将它们读入 R。我读入文件,然后立即聚合并丢弃数据,所以当我接近过程结束时,我并不担心管理内存。我只是真的想加快瓶颈,这恰好是解压缩和读取数据。
每个数据集由 366 行和 17 列组成。这是我到目前为止所做的一个可重复的示例:
构建可重现的数据:
require(data.table)
# Make dir
system("mkdir practice")
# Function to create data
create_write_data <- function(file.nm) {
dt <- data.table(Day=0:365)
dt[, (paste0("V", 1:17)) := lapply(1:17, function(x) rnorm(n=366))]
write.table(dt, paste0("./practice/",file.nm), row.names=FALSE, sep="\t", quote=FALSE)
system(paste0("gzip ./practice/", file.nm))
}
这里是应用代码:
# Apply function to create 10 fake zipped data.frames (550 kb on disk)
tmp <- lapply(paste0("dt", 1:10,".dat"), function(x) create_write_data(x))
这是迄今为止我读取数据最有效的代码:
# Function to read in files as fast as possible
read_Fast <- function(path.gz) {
system(paste0("gzip -d ", path.gz)) # Unzip file
path.dat <- gsub(".gz", "", path.gz)
dat_run <- fread(path.dat)
}
# Apply above function
dat.files <- list.files(path="./practice", full.names = TRUE)
system.time(dat.list <- rbindlist(lapply(dat.files, read_Fast), fill=TRUE))
dat.list
我已经将它装在一个函数中并并行应用它,但对于我需要它的用途来说,它仍然太慢了。
我已经尝试过美妙的h2o 包中的h2o.importFolder,但与使用普通的R 和data.table 相比,它实际上要慢得多。也许有一种方法可以加快文件的解压缩速度,但我不确定。从我运行它的几次中,我注意到文件的解压缩通常需要大约 2/3 的函数时间。
【问题讨论】:
-
通过使用“readr”包中的
read_tsv,我的速度得到了提高(与您迄今为止最高效的代码相比)。rbindlist(lapply(dat.files, read_tsv))
标签: r performance data.table h2o