读取100,000个.dat.gz文件的最快速方式

我有几十万个非常小的.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,但实际上比使用带有data.table的plain R更慢.也许有一种方法来加速文件的解压缩,但我不确定.从我运行这个的几次,我注意到解压文件通常需要大约2/3的功能时间.

我感到惊讶,这实际上是有效的.希望它适用于你的情况.我很好奇地知道速度与从磁盘直接从磁盘读取的压缩数据的速度是如何比较的(尽管是非矢量化的惩罚).

tblNames = fread('cat *dat.gz | gunzip | head -n 1')[, colnames(.SD)]
tbl = fread('cat *dat.gz | gunzip | grep -v "^Day"')
setnames(tbl, tblNames)
tbl
翻译自:https://stackoverflow.com/questions/35763574/fastest-way-to-read-in-100-000-dat-gz-files

转载注明原文:读取100,000个.dat.gz文件的最快速方式