Estou lendo dados muito rapidamente usando o novo arrow
pacote. Parece estar em um estágio bastante inicial.
Especificamente, estou usando o formato colunar em parquet . Isso converte novamente em umdata.frame
em R, mas você pode obter velocidades ainda mais profundas se não o fizer. Esse formato é conveniente, pois também pode ser usado no Python.
Meu principal caso de uso para isso está em um servidor RShiny bastante restrito. Por esses motivos, prefiro manter os dados anexados aos aplicativos (ou seja, fora do SQL) e, portanto, requer tamanho de arquivo pequeno e velocidade.
Este artigo vinculado fornece benchmarking e uma boa visão geral. Citei alguns pontos interessantes abaixo.
https://ursalabs.org/blog/2019-10-columnar-perf/
Tamanho do arquivo
Ou seja, o arquivo Parquet é metade do tamanho do arquivo CSV compactado com gzip. Uma das razões pelas quais o arquivo Parquet é tão pequeno é por causa da codificação de dicionário (também chamada de "compactação de dicionário"). A compactação de dicionário pode produzir uma compactação substancialmente melhor do que o uso de um compressor de bytes de uso geral como LZ4 ou ZSTD (que são usados no formato FST). O Parquet foi projetado para produzir arquivos muito pequenos que são rápidos de ler.
Velocidade de leitura
Ao controlar por tipo de saída (por exemplo, comparando todas as saídas R data.frame uma com a outra), vemos o desempenho do Parquet, Feather e FST caem dentro de uma margem relativamente pequena. O mesmo vale para as saídas pandas.DataFrame. data.table :: fread é impressionantemente competitivo com o tamanho de arquivo de 1,5 GB, mas fica abaixo dos outros no CSV de 2,5 GB.
Teste Independente
Eu realizei alguns testes independentes em um conjunto de dados simulado de 1.000.000 de linhas. Basicamente, embaralhei várias coisas para tentar desafiar a compressão. Também adicionei um pequeno campo de texto de palavras aleatórias e dois fatores simulados.
Dados
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))
)
Leia e escreva
Escrever os dados é fácil.
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)
A leitura dos dados também é fácil.
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)
Testei a leitura desses dados em algumas das opções concorrentes e obtive resultados ligeiramente diferentes dos do artigo acima, o que é esperado.
Esse arquivo não é nem do tamanho do artigo de referência; talvez essa seja a diferença.
Testes
- rds: test_data.rds (20,3 MB)
- parquet2_native: (14,9 MB com maior compactação e
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (14,9 MB com maior compactação)
- parquet: test_data.parquet (40,7 MB)
- fst2: test_data2.fst (27,9 MB com maior compactação)
- fst: 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 lido com
arrow
)
- feather: test_data.feather (157,2 MB lido com
feather
)
Observações
Para este arquivo em particular, fread
é realmente muito rápido. Eu gosto do tamanho pequeno do parquet2
teste altamente compactado . Posso investir tempo para trabalhar com o formato de dados nativo, em vez dedata.frame
se realmente precisar da velocidade.
Aqui fst
também é uma ótima opção. Eu usaria o fst
formato altamente compactado ou o altamente compactado, parquet
dependendo se precisava da troca de velocidade ou tamanho do arquivo.