Самый быстрый способ чтения в 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.importFolder из замечательногоh2o пакет, но на самом деле он намного медленнее по сравнению с использованием обычногоR сdata.table, Может быть, есть способ ускорить распаковку файлов, но я не уверен. Из тех немногих раз, которые я запускал, я заметил, что разархивирование файлов обычно занимает около 2/3 функционального времени.

Ответы на вопрос(3)

Ваш ответ на вопрос