Sto leggendo i dati molto rapidamente utilizzando il nuovo arrow
pacchetto. Sembra essere in una fase abbastanza precoce.
In particolare, sto usando il formato colonnare del parquet . Questo si converte in adata.frame
in R, ma puoi ottenere accelerazioni ancora più profonde se non lo fai. Questo formato è comodo in quanto può essere utilizzato anche da Python.
Il mio caso d'uso principale per questo è su un server RShiny abbastanza contenuto. Per questi motivi, preferisco mantenere i dati allegati alle App (ad esempio, fuori da SQL) e quindi richiedere dimensioni di file ridotte e velocità.
Questo articolo collegato fornisce benchmark e una buona panoramica. Ho citato alcuni punti interessanti di seguito.
https://ursalabs.org/blog/2019-10-columnar-perf/
Dimensione del file
Cioè, il file Parquet è grande la metà del CSV compresso con zip. Uno dei motivi per cui il file Parquet è così piccolo è dovuto alla codifica del dizionario (chiamata anche "compressione del dizionario"). La compressione del dizionario può produrre una compressione sostanzialmente migliore rispetto all'utilizzo di un compressore di byte per scopi generici come LZ4 o ZSTD (che sono utilizzati nel formato FST). Parquet è stato progettato per produrre file molto piccoli e veloci da leggere.
Velocità di lettura
Quando si controlla per tipo di output (ad esempio confrontando tutti gli output di data.frame tra R) vediamo che le prestazioni di Parquet, Feather e FST rientrano in un margine relativamente piccolo l'una dall'altra. Lo stesso vale per gli output pandas.DataFrame. data.table :: fread è straordinariamente competitivo con le dimensioni del file da 1,5 GB ma è in ritardo rispetto agli altri sul CSV da 2,5 GB.
Test indipendente
Ho eseguito alcuni benchmark indipendenti su un set di dati simulato di 1.000.000 di righe. Fondamentalmente ho mescolato un sacco di cose in giro per tentare di sfidare la compressione. Inoltre ho aggiunto un breve campo di testo di parole casuali e due fattori simulati.
Dati
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))
)
Leggere e scrivere
Scrivere i dati è facile.
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)
Anche leggere i dati è facile.
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)
Ho testato la lettura di questi dati rispetto ad alcune delle opzioni concorrenti e ho ottenuto risultati leggermente diversi rispetto all'articolo sopra, che è previsto.
Questo file non è grande come l'articolo di riferimento, quindi forse questa è la differenza.
test
- rds : test_data.rds (20.3 MB)
- parquet2_native: (14.9 MB con compressione maggiore e
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (14.9 MB con compressione maggiore)
- parquet: test_data.parquet (40.7 MB)
- fst2: test_data2.fst (27.9 MB con compressione più alta)
- prima: test_data.fst (76,8 MB)
- fread2: test_data.csv.gz (23.6MB)
- fread: test_data.csv (98.7MB)
- feather_arrow: test_data.feather (157.2 MB letto con
arrow
)
- piuma: test_data.feather (157.2 MB letto con
feather
)
osservazioni
Per questo particolare file, fread
è in realtà molto veloce. Mi piace la piccola dimensione del file dal parquet2
test altamente compresso . Potrei investire il tempo di lavorare con il formato di dati nativo piuttosto che adata.frame
se avessi davvero bisogno di accelerare.
Ecco fst
anche un'ottima scelta. Vorrei utilizzare il fst
formato altamente compresso o altamente compresso a parquet
seconda se avessi bisogno di compromettere la velocità o la dimensione del file.