Ich lese Daten sehr schnell mit dem neuen arrow
Paket. Es scheint sich in einem recht frühen Stadium zu befinden.
Konkret verwende ich die Parkett spaltenförmiges Format. Dies konvertiert zurück in ein data.frame
in R, aber Sie können sogar noch größere Geschwindigkeitssteigerungen erzielen, wenn Sie dies nicht tun. Dieses Format ist praktisch, da es auch in Python verwendet werden kann.
Mein Hauptanwendungsfall für diese ist auf einem ziemlich zurückhaltenden RShiny-Server. Aus diesen Gründen ziehe ich es vor, die Daten an die Apps zu binden (d.h. außerhalb von SQL), und benötige daher eine kleine Dateigröße sowie eine geringe Geschwindigkeit.
Dieser verlinkte Artikel bietet ein Benchmarking und einen guten Überblick. Ich habe einige interessante Punkte unten zitiert.
https://ursalabs.org/blog/2019-10-columnar-perf/
Größe der Datei
Das heißt, die Parquet-Datei ist nur halb so groß wie die gepackte CSV-Datei. Einer der Gründe, warum die Parquet-Datei so klein ist, liegt in der Wörterbuchkodierung (auch "Wörterbuchkomprimierung" genannt). Die Wörterbuchkomprimierung kann zu einer wesentlich besseren Komprimierung führen als die Verwendung eines Allzweck-Bytes-Kompressors wie LZ4 oder ZSTD (die im FST-Format verwendet werden). Parquet wurde entwickelt, um sehr kleine Dateien zu erzeugen, die schnell zu lesen sind.
Lesegeschwindigkeit
Bei der Kontrolle nach Ausgabetypen (z. B. beim Vergleich aller R data.frame-Ausgaben untereinander) zeigt sich, dass die Leistung von Parquet, Feather und FST innerhalb eines relativ geringen Abstands zueinander liegt. Das Gleiche gilt für die pandas.DataFrame-Ausgaben. data.table::fread ist bei einer Dateigröße von 1,5 GB beeindruckend wettbewerbsfähig, liegt aber bei einer CSV-Datei von 2,5 GB hinter den anderen zurück.
Unabhängiger Test
Ich habe ein unabhängiges Benchmarking mit einem simulierten Datensatz von 1.000.000 Zeilen durchgeführt. Dabei habe ich einige Dinge umgestellt, um die Komprimierung in Frage zu stellen. Außerdem habe ich ein kurzes Textfeld mit zufälligen Wörtern und zwei simulierte Faktoren hinzugefügt.
Daten
library(dplyr)
library(tibble)
library(OpenRepGrid)
n <- 1000000
set.seed(1234)
some_levels1 <- sapply(1:10, function(x) paste(LETTERS[sample(1:26, size = sample(3:8, 1), replace = TRUE)], collapse = ""))
some_levels2 <- sapply(1:65, function(x) paste(LETTERS[sample(1:26, size = sample(5:16, 1), replace = TRUE)], collapse = ""))
test_data <- mtcars %>%
rownames_to_column() %>%
sample_n(n, replace = TRUE) %>%
mutate_all(~ sample(., length(.))) %>%
mutate(factor1 = sample(some_levels1, n, replace = TRUE),
factor2 = sample(some_levels2, n, replace = TRUE),
text = randomSentences(n, sample(3:8, n, replace = TRUE))
)
Lesen und Schreiben
Das Schreiben der Daten ist einfach.
library(arrow)
write_parquet(test_data , "test_data.parquet")
# you can also mess with the compression
write_parquet(test_data, "test_data2.parquet", compress = "gzip", compression_level = 9)
Auch das Ablesen der Daten ist einfach.
read_parquet("test_data.parquet")
# this option will result in lightning fast reads, but in a different format.
read_parquet("test_data2.parquet", as_data_frame = FALSE)
Ich habe das Lesen dieser Daten mit einigen der konkurrierenden Optionen verglichen und erhielt etwas andere Ergebnisse als in dem obigen Artikel, was zu erwarten war.
Diese Datei ist bei weitem nicht so groß wie der Benchmark-Artikel, vielleicht ist das der Unterschied.
Tests
- rds: test_data.rds (20,3 MB)
- parquet2_native: (14,9 MB mit höherer Kompression und
as_data_frame = FALSE
)
- Parkett2: test_data2.parquet (14,9 MB mit höherer Kompression)
- Parkett: test_data.parquet (40,7 MB)
- fst2: test_data2.fst (27,9 MB mit höherer Kompression)
- fst: test_data.fst (76,8 MB)
- fread2: test_data.csv.gz (23,6MB)
- fread: test_data.csv (98.7MB)
- feder_pfeil: test_data.feather (157,2 MB gelesen mit
arrow
)
- feder: test_data.feather (157,2 MB gelesen mit
feather
)
Beobachtungen
Für diese spezielle Datei, fread
ist tatsächlich sehr schnell. Ich mag die geringe Dateigröße der hochkomprimierten parquet2
Test. Ich werde vielleicht die Zeit investieren, um mit dem nativen Datenformat zu arbeiten, anstatt mit einem data.frame
wenn ich die höhere Geschwindigkeit wirklich brauche.
Aquí fst
ist ebenfalls eine gute Wahl. Ich würde entweder das hochkomprimierte fst
Format oder das hochkomprimierte parquet
je nachdem, ob ich einen Kompromiss zwischen Geschwindigkeit oder Dateigröße brauche.