मैं नए arrow
पैकेज का उपयोग करके बहुत तेज़ी से डेटा पढ़ रहा हूं । यह एक प्रारंभिक चरण में प्रतीत होता है।
विशेष रूप से, मैं लकड़ी की छत स्तंभ प्रारूप का उपयोग कर रहा हूं । यह एक में वापस धर्मान्तरितdata.frame
आर में , लेकिन यदि आप नहीं करते हैं तो आप और भी तेज गति प्राप्त कर सकते हैं। यह प्रारूप सुविधाजनक है क्योंकि इसका उपयोग पायथन से भी किया जा सकता है।
इसके लिए मेरा मुख्य उपयोग मामला काफी संयमित RShiny सर्वर पर है। इन कारणों से, मैं ऐप्स (यानी, SQL से बाहर) से जुड़े डेटा को रखना पसंद करता हूं, और इसलिए छोटे फ़ाइल आकार के साथ-साथ गति की आवश्यकता होती है।
यह जुड़ा हुआ लेख बेंचमार्किंग और एक अच्छा अवलोकन प्रदान करता है। मैंने नीचे कुछ दिलचस्प बिंदुओं को उद्धृत किया है।
https://ursalabs.org/blog/2019-10-columnar-perf/
फाइल का आकार
यही है, Parquet फ़ाइल gzipped CSV जितनी बड़ी है, आधी है। Parquet फ़ाइल इतनी छोटी होने के कारणों में से एक शब्दकोष-एन्कोडिंग (जिसे "शब्दकोश संपीड़न" भी कहा जाता है) है। डिक्शनरी कम्प्रेशन एक सामान्य प्रयोजन बाइट्स कंप्रेसर जैसे LZ4 या ZSTD (जो FST प्रारूप में उपयोग किया जाता है) का उपयोग करने की तुलना में काफी बेहतर संपीड़न प्राप्त कर सकता है। लकड़ी की छत बहुत छोटी फ़ाइलों का उत्पादन करने के लिए डिज़ाइन किया गया था जो पढ़ने में तेज हैं।
स्पीड पढ़ें
आउटपुट प्रकार द्वारा नियंत्रित करते समय (जैसे सभी R डेटा.फ्रेम आउटपुट की एक-दूसरे से तुलना करना) हम देखते हैं कि एक दूसरे के अपेक्षाकृत छोटे अंतर के भीतर परक, पंख, और FST का प्रदर्शन गिरता है। वही पंडों का सच है। DataFrame आउटपुट। data.table :: fread प्रभावशाली रूप से 1.5 GB फ़ाइल आकार के साथ प्रतिस्पर्धात्मक है, लेकिन 2.5 GB CSV पर अन्य को पीछे छोड़ देता है।
स्वतंत्र परीक्षण
मैंने 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 MB)
- parquet2_native: (14.9 एमबी अधिक संपीड़न और
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (उच्च संपीड़न के साथ 14.9 MB)
- लकड़ी की छत: test_data.parquet (40.7 एमबी)
- fst2: test_data2.fst (उच्च संपीड़न के साथ 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 के साथ पढ़ा गया
arrow
)
- पंख: test_data.feather (157.2 MB के साथ पढ़ा गया
feather
)
टिप्पणियों
इस विशेष फ़ाइल के लिए, fread
वास्तव में बहुत तेज है। मुझे अत्यधिक संपीड़ित parquet2
परीक्षण से छोटा फ़ाइल आकार पसंद है । मैं मूल डेटा प्रारूप के बजाय काम करने के लिए समय का निवेश कर सकता हूंdata.frame
यदि मुझे वास्तव में गति की आवश्यकता है, तो मैं ।
यहाँ fst
भी एक बढ़िया विकल्प है। मैं या तो अत्यधिक संकुचित fst
प्रारूप या अत्यधिक संपीड़ित का उपयोग करेगा parquet
यदि मुझे गति या फ़ाइल आकार के व्यापार की आवश्यकता होती है।