Ho poche centinaia di migliaia di piccoli file .dat.gz
che voglio leggere in R nel modo più efficiente possibile. Ho letto il file e poi ho immediatamente aggregato e scartato i dati, quindi non sono preoccupato di gestire la memoria man mano che mi avvicino alla fine del processo. Voglio davvero accelerare il collo di bottiglia, che accade per decomprimere e leggere i dati.Il modo più veloce di leggere in 100.000 file .dat.gz
Ogni set di dati è costituito da 366 righe e 17 colonne. Ecco un esempio riproducibile di quello che sto facendo finora:
Costruire dati riproducibili:
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))
}
E qui è il codice di applicazione:
# 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))
E qui è il mio codice più efficiente finora leggere nei dati:
# 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
Ho imbottigliato in una funzione e l'ho applicato in allel, ma è ancora troppo lento per ciò di cui ho bisogno.
Ho già provato il h2o.importFolder
dal pacchetto meraviglioso h2o
, ma in realtà è molto molto più lento rispetto all'utilizzo di pianura R
con data.table
. Forse c'è un modo per accelerare la decompressione dei file, ma non sono sicuro. Dalle poche volte che l'ho eseguito, ho notato che la decompressione dei file richiede in genere circa 2/3 del tempo di funzionamento.
Sto migliorando le velocità (rispetto al codice più efficiente finora) utilizzando 'read_tsv' dal pacchetto" readr ". 'rbindlist (lapply (dat.files, read_tsv))' – A5C1D2H2I1M1N2O1R2T1