Je lis les données très rapidement en utilisant le nouveau arrow
package. Il semble être à un stade assez précoce.
Plus précisément, j'utilise le format colonnaire parquet . Cela se reconvertit en un data.frame
dans R, mais vous pouvez obtenir des accélérations encore plus profondes si vous ne le faites pas. Ce format est pratique car il peut également être utilisé à partir de Python.
Mon cas d'utilisation principal pour cela est sur un serveur RShiny assez restreint. Pour ces raisons, je préfère garder les données attachées aux applications (c'est-à-dire en dehors de SQL), et donc nécessiter une petite taille de fichier ainsi qu'une vitesse.
Cet article lié fournit une analyse comparative et un bon aperçu. J'ai cité quelques points intéressants ci-dessous.
https://ursalabs.org/blog/2019-10-columnar-perf/
Taille du fichier
Autrement dit, le fichier Parquet est deux fois moins volumineux que le CSV compressé. L'une des raisons pour lesquelles le fichier Parquet est si petit est à cause de l'encodage du dictionnaire (également appelé «compression du dictionnaire»). La compression de dictionnaire peut produire une compression sensiblement meilleure que l'utilisation d'un compresseur d'octets à usage général comme LZ4 ou ZSTD (qui sont utilisés au format FST). Parquet a été conçu pour produire de très petits fichiers faciles à lire.
Vitesse de lecture
Lors du contrôle par type de sortie (par exemple en comparant toutes les sorties R data.frame entre elles), nous voyons que les performances de Parquet, Feather et FST se situent dans une marge relativement petite les unes des autres. Il en va de même pour les sorties pandas.DataFrame. data.table :: fread est incroyablement compétitif avec la taille de fichier de 1,5 Go mais est en retard sur les autres sur le CSV de 2,5 Go.
Test indépendant
J'ai effectué une analyse comparative indépendante sur un ensemble de données simulées de 1 000 000 de lignes. Fondamentalement, j'ai mélangé un tas de choses pour tenter de contester la compression. J'ai également ajouté un court champ de texte de mots aléatoires et deux facteurs simulés.
Les données
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))
)
Lire et écrire
L'écriture des données est 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)
La lecture des données est également 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)
J'ai testé la lecture de ces données par rapport à quelques-unes des options concurrentes et j'ai obtenu des résultats légèrement différents de ceux de l'article ci-dessus, ce qui est attendu.
Ce fichier est loin d'être aussi volumineux que l'article de référence, alors c'est peut-être la différence.
Les tests
- rds: test_data.rds (20,3 Mo)
- parquet2_native: (14,9 Mo avec une compression plus élevée et
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (14,9 Mo avec une compression plus élevée)
- parquet: test_data.parquet (40,7 Mo)
- fst2: test_data2.fst (27,9 Mo avec une compression plus élevée)
- fst: test_data.fst (76,8 Mo)
- fread2: test_data.csv.gz (23,6 Mo)
- fread: test_data.csv (98,7 Mo)
- feather_arrow: test_data.feather (157,2 Mo lu avec
arrow
)
- feather: test_data.feather (157,2 Mo lu avec
feather
)
Observations
Pour ce fichier particulier, fread
est en fait très rapide. J'aime la petite taille du fichier du parquet2
test hautement compressé . Je peux investir du temps pour travailler avec le format de données natif plutôt que data.frame
si j'ai vraiment besoin d'accélérer.
Voici fst
également un excellent choix. J'utiliserais soit le fst
format hautement compressé , soit le format hautement compressé, parquet
selon que j'aurais besoin d'un compromis entre la vitesse ou la taille du fichier.