Yeni arrow
paketi kullanarak çok hızlı veri okuyorum . Oldukça erken bir aşamada gibi görünüyor.
Özellikle, parke sütun biçimini kullanıyorum. Bu, data.frame
R'de bir a'ya dönüşür , ancak bunu yapmazsanız daha derin hızlanma elde edebilirsiniz. Bu format, Python'dan da kullanılabildiği için uygundur.
Bunun için ana kullanım durumum oldukça kısıtlanmış bir RShiny sunucusunda. Bu nedenlerden dolayı, Uygulamalara bağlı verileri (yani SQL dışında) tutmayı tercih ederim ve bu nedenle hızın yanı sıra küçük dosya boyutu da gerektirir.
Bu bağlantılı makale karşılaştırma ve iyi bir genel bakış sunar. Aşağıda bazı ilginç noktalara değindim.
https://ursalabs.org/blog/2019-10-columnar-perf/
Dosya boyutu
Yani, Parke dosyası gzip edilmiş CSV'nin yarısı kadar büyüktür. Parke dosyasının çok küçük olmasının nedenlerinden biri sözlük kodlamasıdır (“sözlük sıkıştırma” olarak da bilinir). Sözlük sıkıştırması, LZ4 veya ZSTD (FST formatında kullanılan) gibi genel amaçlı bir bayt kompresör kullanmaktan önemli ölçüde daha iyi sıkıştırma sağlayabilir. Parke, hızlı okunabilen çok küçük dosyalar üretmek için tasarlanmıştır.
Okuma Hızı
Çıktı türüne göre kontrol ederken (örn. Tüm R verileri. Çerçeve çıktılarını birbirleriyle karşılaştırırken), Parke, Geçiş Yumuşatma ve FST'nin performanslarının nispeten küçük bir marjda olduğunu görüyoruz. Aynı şey pandas.DataFrame çıkışları için de geçerlidir. data.table :: fread, 1,5 GB dosya boyutu ile etkileyici bir şekilde rekabet edebilir, ancak diğerlerini 2,5 GB CSV'de geride bırakır.
Bağımsız Test
1.000.000 satırlık simüle edilmiş veri kümesinde bağımsız bir karşılaştırma yaptım. Temelde sıkıştırmaya meydan okumak için bir sürü şeyi karıştırdım. Ayrıca rastgele kelimelerin kısa bir metin alanını ve iki simüle edilmiş faktörü ekledim.
Veri
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))
)
Oku ve yaz
Verileri yazmak kolaydır.
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)
Verileri okumak da kolaydır.
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)
Bu verileri rakip seçeneklerden birkaçına karşı okumayı test ettim ve beklenen makaleye göre biraz farklı sonuçlar elde ettim.
Bu dosya kıyaslama makalesi kadar büyük değildir, bu yüzden belki de fark budur.
Testler
- rds: test_data.rds (20.3 MB)
- parquet2_native: (daha yüksek sıkıştırma ile 14,9 MB ve
as_data_frame = FALSE
)
- parke2: test_data2.parquet (daha yüksek sıkıştırma ile 14.9 MB)
- parke: test_data.parquet (40.7 MB)
- fst2: test_data2.fst (daha yüksek sıkıştırma ile 27,9 MB)
- 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 okuma ile
arrow
)
- feather: test_data.feather (157,2 MB okuma ile
feather
)
Gözlemler
Bu dosya fread
için aslında çok hızlı. Yüksek sıkıştırılmış parquet2
testten küçük dosya boyutunu seviyorum . data.frame
Gerçekten hızlanmaya ihtiyacım olursa , yerel veri formatıyla çalışmak için zaman harcayabilirim .
Burada fst
da harika bir seçim. Ben hız veya dosya boyutu takas gerekiyordu bağlı olarak ben fst
ya yüksek derecede sıkıştırılmış formatı ya da çok sıkıştırılmış kullanırsınız parquet
.