Estoy leyendo datos muy rápidamente usando el nuevo arrow
paquete. Parece estar en una etapa bastante temprana.
Específicamente, estoy usando el formato columnar de parquet . Esto convierte de nuevo a a data.frame
en R, pero puede obtener aceleraciones aún más profundas si no lo hace. Este formato es conveniente ya que también se puede usar desde Python.
Mi principal caso de uso para esto es en un servidor RShiny bastante restringido. Por estas razones, prefiero mantener los datos adjuntos a las aplicaciones (es decir, fuera de SQL) y, por lo tanto, requieren un tamaño de archivo pequeño y velocidad.
Este artículo vinculado proporciona evaluaciones comparativas y una buena descripción general. He citado algunos puntos interesantes a continuación.
https://ursalabs.org/blog/2019-10-columnar-perf/
Tamaño del archivo
Es decir, el archivo Parquet es la mitad de grande que incluso el CSV comprimido. Una de las razones por las que el archivo Parquet es tan pequeño es por la codificación del diccionario (también llamada "compresión del diccionario"). La compresión de diccionario puede producir una compresión sustancialmente mejor que el uso de un compresor de bytes de uso general como LZ4 o ZSTD (que se usan en el formato FST). Parquet fue diseñado para producir archivos muy pequeños que son rápidos de leer.
Velocidad de lectura
Cuando se controla por tipo de salida (por ejemplo, comparando todas las salidas de datos de R de marco entre sí), vemos que el rendimiento de Parquet, Feather y FST cae dentro de un margen relativamente pequeño entre sí. Lo mismo se aplica a las salidas pandas.DataFrame. data.table :: fread es impresionantemente competitivo con el tamaño de archivo de 1,5 GB, pero está por detrás de los demás en el CSV de 2,5 GB.
Prueba independiente
Realicé algunas evaluaciones comparativas independientes en un conjunto de datos simulado de 1,000,000 de filas. Básicamente barajé un montón de cosas para intentar desafiar la compresión. También agregué un campo de texto corto de palabras aleatorias y dos factores simulados.
Datos
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))
)
Lee y escribe
Escribir los datos es 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)
Leer los datos también es 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)
Probé la lectura de estos datos con algunas de las opciones de la competencia, y obtuve resultados ligeramente diferentes a los del artículo anterior, que es de esperar.
Este archivo no es tan grande como el artículo de referencia, así que tal vez esa sea la diferencia.
Pruebas
- rds: test_data.rds (20.3 MB)
- parquet2_native: (14.9 MB con mayor compresión y
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (14.9 MB con mayor compresión)
- parquet: test_data.parquet (40.7 MB)
- fst2: test_data2.fst (27.9 MB con mayor compresión)
- 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 de lectura con
arrow
)
- feather: test_data.feather (157,2 MB de lectura con
feather
)
Observaciones
Para este archivo en particular, en fread
realidad es muy rápido. Me gusta el pequeño tamaño de archivo de la parquet2
prueba altamente comprimida . Puedo invertir el tiempo para trabajar con el formato de datos nativo en lugar de data.frame
si realmente necesito acelerar.
Aquí fst
también hay una gran opción. Usaría el fst
formato altamente comprimido o el altamente comprimido parquet
dependiendo de si necesitaba la velocidad o el tamaño del archivo.