Я дуже швидко читаю дані, використовуючи новий arrow
пакет. Здається, він знаходиться на досить ранній стадії.
Зокрема, я використовую стовпчастий формат паркету . Це перетворюється назад в a data.frame
в R, але ви можете отримати ще більш глибокі прискорення, якщо цього не зробите. Цей формат зручний, оскільки його можна використовувати і з Python.
Головний мій приклад для цього - на досить стриманому сервері RShiny. З цих причин я вважаю за краще зберігати дані, додані до Додатків (тобто, поза SQL), а тому вимагаю невеликого розміру файлу, а також швидкості.
Ця пов’язана стаття забезпечує тестування та хороший огляд. Нижче я наводив кілька цікавих моментів.
https://ursalabs.org/blog/2019-10-columnar-perf/
Розмір файлу
Тобто файл Паркет наполовину більший, ніж навіть gzipped CSV. Однією з причин того, що файл Паркет настільки малий, є кодування словника (його також називають «стиснення словника»). Стиснення словника може призвести до значно кращого стиснення, ніж використання компресорів байтів загального призначення, таких як LZ4 або ZSTD (які використовуються у форматі FST). Паркет був розроблений для створення дуже маленьких файлів, які швидко читаються.
Швидкість читання
Під час контролю за типом виводу (наприклад, порівнюючи всі R-виводи даних data.frame один з одним), ми бачимо, що продуктивність Parquet, Peather і FST потрапляє в відносно невеликий запас один від одного. Те саме стосується виходів pandas.DataFrame. data.table :: fread надзвичайно конкурентоспроможний за розміром файлу 1,5 ГБ, але відстає від інших на CSV 2,5 Гб.
Незалежний тест
Я здійснив кілька незалежних бенчмаркінгу на модельованому наборі даних 1 000 000 рядків. В основному я перетасував купу речей, щоб спробувати оскаржити стиснення. Також я додав коротке текстове поле випадкових слів і два імітовані фактори.
Дані
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
)
- паркет2 : 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 МБ)
- feather_arrow: test_data.feather (157,2 Мб читати разом
arrow
)
- перо: test_data.feather (157,2 Мб читати з
feather
)
Спостереження
Цей конкретний файл fread
насправді дуже швидкий. Мені подобається невеликий розмір файлу із сильно стиснутого parquet2
тесту. Я можу вкласти час для роботи з нативним форматом даних, а не з, data.frame
якщо мені справді потрібна швидкість.
Тут fst
також чудовий вибір. Я б або використовував сильно стислий fst
формат, або сильно стислий, parquet
залежно від того, чи потрібна швидкість чи розмір файлу.