Tôi có một vài trăm nghìn tệp rất nhỏ .dat.gz
mà tôi muốn đọc vào R theo cách hiệu quả nhất có thể. Tôi đọc trong tập tin và sau đó ngay lập tức tổng hợp và loại bỏ các dữ liệu, vì vậy tôi không lo lắng về việc quản lý bộ nhớ khi tôi nhận được gần cuối của quá trình. Tôi thực sự muốn tăng tốc độ tắc nghẽn, điều này xảy ra để giải nén và đọc dữ liệu.Cách nhanh nhất để đọc trong 100.000 tệp .dat.gz
Mỗi tập dữ liệu bao gồm 366 hàng và 17 cột. Dưới đây là một ví dụ tái sản xuất những gì tôi đang làm cho đến nay:
Xây dựng dữ liệu tái sản xuất:
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))
}
Và đây là mã áp dụng:
# 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))
Và đây là mã hiệu quả nhất của tôi cho đến nay để đọc trong dữ liệu:
# 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
Tôi đã đóng gói chức năng này và áp dụng nó ngang hàng allel, nhưng nó vẫn còn quá nhiều cho những gì tôi cần này cho.
Tôi đã thử các h2o.importFolder
từ gói h2o
tuyệt vời, nhưng nó thực sự chậm hơn nhiều so với sử dụng đồng bằng R
với data.table
. Có lẽ có một cách để tăng tốc độ giải nén các tập tin, nhưng tôi không chắc chắn. Từ vài lần mà tôi đã chạy điều này, tôi đã nhận thấy rằng việc giải nén các tập tin thường mất khoảng 2/3 của thời gian chức năng.
Tôi đang nhận được tốc độ cải thiện (so với mã hiệu quả nhất cho đến nay) bằng cách sử dụng 'read_tsv' từ gói" readr ". 'rbindlist (lapply (dat.files, read_tsv))' – A5C1D2H2I1M1N2O1R2T1