Ich habe ein paar hunderttausend sehr kleine .dat.gz
Dateien, die ich in R möglichst effizient einlesen möchte. Ich lese die Datei ein und aggregiere und verwerfe die Daten sofort. Daher mache ich mir keine Sorgen über die Speicherverwaltung, wenn ich am Ende des Prozesses angelangt bin. Ich möchte den Engpass, der beim Entpacken und Einlesen der Daten passiert, wirklich beschleunigen.Schnellste Möglichkeit zum Einlesen von 100.000 .dat.gz Dateien
Jeder Datensatz besteht aus 366 Zeilen und 17 Spalten. Hier ist ein reproduzierbares Beispiel dafür, was ich bisher tue:
Gebäude reproduzierbare Daten:
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))
}
Und hier ist der Code der Anwendung:
# 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))
Und hier ist mein effizientesten Code so weit Zum Einlesen der Daten:
Ich habe dies in einer Funktion abgefüllt und in Par. angewendet Allel, aber es ist immer noch viel viel zu langsam für das, wofür ich das brauche.
Ich habe bereits versucht, die h2o.importFolder
vom wunderschönen h2o
Paket, aber es ist eigentlich viel viel langsamer im Vergleich zu einfachen R
mit data.table
verwenden. Vielleicht gibt es eine Möglichkeit, das Entpacken von Dateien zu beschleunigen, aber ich bin unsicher. Von den wenigen Malen, die ich ausgeführt habe, habe ich bemerkt, dass das Entpacken der Dateien normalerweise ungefähr 2/3 der Funktionszeit dauert.
Ich bekomme verbesserte Geschwindigkeiten (im Vergleich zu Ihrem bisher effizientesten Code), indem Sie 'read_tsv' aus dem" readr "-Paket verwenden. 'rbindlist (lapply (dat.files, read_tsv))' – A5C1D2H2I1M1N2O1R2T1