Saya membaca data dengan sangat cepat menggunakan arrow
paket baru . Tampaknya berada pada tahap yang cukup awal.
Secara khusus, saya menggunakan format kolom parket . Ini mengonversi kembali ke data.frame
dalam R, tetapi Anda bisa mendapatkan speedup lebih dalam jika tidak. Format ini nyaman karena dapat digunakan dari Python juga.
Kasus penggunaan utama saya untuk ini adalah pada server RShiny yang cukup terkendali. Untuk alasan ini, saya lebih suka menyimpan data yang melekat pada Aplikasi (yaitu, keluar dari SQL), dan karena itu memerlukan ukuran file kecil serta kecepatan.
Artikel tertaut ini memberikan tolok ukur dan tinjauan umum yang baik. Saya telah mengutip beberapa poin menarik di bawah ini.
https://ursalabs.org/blog/2019-10-columnar-perf/
Ukuran file
Artinya, file Parket hanya setengah dari CSV yang di-gzip. Salah satu alasan mengapa file Parket sangat kecil adalah karena kamus-encoding (juga disebut "kompresi kamus"). Kompresi kamus dapat menghasilkan kompresi yang jauh lebih baik daripada menggunakan kompresor byte tujuan umum seperti LZ4 atau ZSTD (yang digunakan dalam format FST). Parket dirancang untuk menghasilkan file yang sangat kecil yang cepat dibaca.
Baca Kecepatan
Ketika mengendalikan berdasarkan tipe output (mis. Membandingkan semua data R. Output frame satu sama lain) kita melihat kinerja Parket, Bulu, dan FST berada dalam margin yang relatif kecil satu sama lain. Hal yang sama berlaku untuk output panda. DataFrame. data.table :: fread sangat bersaing dengan ukuran file 1,5 GB tetapi tertinggal yang lain pada CSV 2,5 GB.
Tes Independen
Saya melakukan beberapa pembandingan independen pada set data simulasi 1.000.000 baris. Pada dasarnya saya mengocok banyak hal di sekitar untuk mencoba menantang kompresi. Saya juga menambahkan bidang teks pendek kata-kata acak dan dua faktor simulasi.
Data
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))
)
Baca dan tulis
Menulis data itu mudah.
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)
Membaca data juga mudah.
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)
Saya diuji membaca data ini terhadap beberapa opsi yang bersaing, dan memang mendapatkan hasil yang sedikit berbeda dibandingkan dengan artikel di atas, yang diharapkan.
File ini jauh dari ukuran artikel benchmark, jadi mungkin itulah bedanya.
Tes
- rds: test_data.rds (20,3 MB)
- parquet2_native: (14,9 MB dengan kompresi lebih tinggi dan
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (14.9 MB dengan kompresi lebih tinggi)
- parket: test_data.parquet (40,7 MB)
- fst2: test_data2.fst (27,9 MB dengan kompresi lebih tinggi)
- pertama: 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 dibaca bersama
arrow
)
- feather: test_data.feather (157,2 MB dibaca bersama
feather
)
Pengamatan
Untuk file khusus ini, fread
sebenarnya sangat cepat. Saya suka ukuran file kecil dari parquet2
tes yang sangat terkompresi . Saya dapat menginvestasikan waktu untuk bekerja dengan format data asli daripada data.frame
jika saya benar-benar perlu mempercepat.
Ini fst
juga pilihan yang bagus. Saya akan menggunakan fst
format yang sangat terkompresi atau sangat terkompresi parquet
tergantung pada apakah saya memerlukan kecepatan atau ukuran file trade off.