Я очень быстро читаю данные с помощью нового пакета arrow
. Похоже, он находится на довольно ранней стадии.
В частности, я использую столбчатый формат паркет. Это преобразуется обратно в data.frame
в R, но вы можете получить еще большее ускорение, если этого не сделаете. Этот формат удобен, так как его можно использовать и из Python.
Мой основной вариант использования для этого - на довольно ограниченном сервере RShiny. По этим причинам я предпочитаю хранить данные прикрепленными к приложениям (т.е. вне SQL), и поэтому требую небольшой размер файла, а также скорость.
В этой связанной статье представлен сравнительный анализ и хороший обзор. Ниже я привел несколько интересных моментов.
https://ursalabs.org/blog/2019-10-columnar-perf/ а>
Размер файла
То есть файл Parquet вдвое меньше даже сжатого с помощью gzip CSV. Одна из причин того, что файл Parquet такой маленький, - это кодирование по словарю (также называемое «сжатием словаря»). Сжатие словаря может дать значительно лучшее сжатие, чем использование компрессора байтов общего назначения, такого как LZ4 или ZSTD (которые используются в формате FST). Parquet был разработан для создания очень маленьких файлов, которые быстро читаются.
Скорость чтения
При управлении по типу вывода (например, при сравнении всех выходных данных R data.frame друг с другом) мы видим, что производительность Parquet, Feather и FST находится в относительно небольшом диапазоне друг от друга. То же самое и с выводами pandas.DataFrame. data.table :: fread впечатляюще конкурирует с размером файла 1,5 ГБ, но отстает от других на 2,5 ГБ CSV.
Независимый тест
Я провел несколько независимых сравнительных тестов на смоделированном наборе данных из 1000000 строк. В основном я перетасовал кучу вещей, чтобы попытаться оспорить сжатие. Также я добавил короткое текстовое поле со случайными словами и двумя смоделированными факторами.
Данные
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))
)
Прочти и напиши
Запись данных проста.
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)
Считывать данные также легко.
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)
Я протестировал чтение этих данных с несколькими конкурирующими вариантами и получил несколько иные результаты, чем в статье выше, чего и следовало ожидать.
Этот файл далеко не такой большой, как статья о тесте, так что, возможно, в этом разница.
Тесты
- rds: test_data.rds (20,3 МБ)
- parquet2_native: (14,9 МБ с более высоким сжатием и
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (14,9 МБ с более высоким сжатием)
- паркет: test_data.parquet (40,7 МБ)
- fst2: test_data2.fst (27,9 МБ с более высоким сжатием)
- fst: test_data.fst (76,8 МБ)
- fread2: test_data.csv.gz (23,6 МБ)
- fread: test_data.csv (98,7 МБ)
- Pen_arrow: test_data.feather (157,2 МБ при чтении с
arrow
)
- перо: test_data.feather (157,2 МБ при чтении с
feather
)
Наблюдения
Для этого конкретного файла fread
действительно работает очень быстро. Мне нравится небольшой размер файла из теста parquet2
с высокой степенью сжатия. Я могу потратить время на работу с собственным форматом данных, а не data.frame
, если мне действительно нужно ускорение.
Здесь fst
тоже отличный выбор. Я бы использовал либо сильно сжатый fst
формат, либо сильно сжатый parquet
, в зависимости от того, нужен ли мне компромисс между скоростью или размером файла.
person
Adam
schedule
12.11.2019