यहाँ एक्सेल फ़ाइल R
और उत्तरों के ढेरों को पढ़ने के विभिन्न तरीकों के प्रसार को देखते हुए , मैंने सोचा कि मैं यहाँ कुछ प्रकाशों को शेड करने की कोशिश करूँगा, जिनमें से किसी भी विकल्प का उल्लेख सबसे अच्छा (कुछ सरल स्थितियों में) किया जाए।
xlsx
जब से मैंने R
और कुछ भी नहीं किया है, तो मैं खुद का उपयोग कर रहा हूं , जड़ता के लिए उपयोग करना शुरू कर दिया है, और मैंने हाल ही में देखा है कि कोई भी वस्तुगत जानकारी नहीं लगती है कि कौन सा पैकेज बेहतर काम करता है।
किसी भी बेंचमार्किंग अभ्यास में कठिनाइयों का सामना करना पड़ता है क्योंकि कुछ पैकेज दूसरों की तुलना में कुछ स्थितियों को बेहतर तरीके से संभालना सुनिश्चित करते हैं, और अन्य कैविटी का एक झरना है।
उस ने कहा, मैं एक (प्रतिलिपि प्रस्तुत करने योग्य) डेटा सेट का उपयोग कर रहा हूं जो मुझे लगता है कि एक बहुत ही सामान्य प्रारूप (8 स्ट्रिंग फ़ील्ड, 3 संख्यात्मक, 1 पूर्णांक, 3 दिनांक) में है:
set.seed(51423)
data.frame(
str1 = sample(sprintf("%010d", 1:NN)), #ID field 1
str2 = sample(sprintf("%09d", 1:NN)), #ID field 2
#varying length string field--think names/addresses, etc.
str3 =
replicate(NN, paste0(sample(LETTERS, sample(10:30, 1L), TRUE),
collapse = "")),
#factor-like string field with 50 "levels"
str4 = sprintf("%05d", sample(sample(1e5, 50L), NN, TRUE)),
#factor-like string field with 17 levels, varying length
str5 =
sample(replicate(17L, paste0(sample(LETTERS, sample(15:25, 1L), TRUE),
collapse = "")), NN, TRUE),
#lognormally distributed numeric
num1 = round(exp(rnorm(NN, mean = 6.5, sd = 1.5)), 2L),
#3 binary strings
str6 = sample(c("Y","N"), NN, TRUE),
str7 = sample(c("M","F"), NN, TRUE),
str8 = sample(c("B","W"), NN, TRUE),
#right-skewed integer
int1 = ceiling(rexp(NN)),
#dates by month
dat1 =
sample(seq(from = as.Date("2005-12-31"),
to = as.Date("2015-12-31"), by = "month"),
NN, TRUE),
dat2 =
sample(seq(from = as.Date("2005-12-31"),
to = as.Date("2015-12-31"), by = "month"),
NN, TRUE),
num2 = round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L),
#date by day
dat3 =
sample(seq(from = as.Date("2015-06-01"),
to = as.Date("2015-07-15"), by = "day"),
NN, TRUE),
#lognormal numeric that can be positive or negative
num3 =
(-1) ^ sample(2, NN, TRUE) * round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L)
)
मैं तो सीएसवी को यह लिखा था और लिब्रे ऑफिस में खोला गया और एक .xlsx फ़ाइल के रूप में यह बचा लिया, तो बेंचमार्क संकुल इस थ्रेड में उल्लिखित के 4: xlsx
, openxlsx
, readxl
, और gdata
, डिफ़ॉल्ट विकल्पों का उपयोग कर (मैं भी का एक संस्करण की कोशिश की कि क्या है या नहीं मैं कॉलम प्रकार निर्दिष्ट करें, लेकिन इससे रैंकिंग में बदलाव नहीं हुआ)।
मैं बाहर RODBC
कर रहा हूँ क्योंकि मैं लिनक्स पर हूँ; XLConnect
ऐसा लगता है कि इसका प्राथमिक उद्देश्य एकल एक्सेल शीट में पढ़ना नहीं है, बल्कि पूरे एक्सेल वर्कबुक को आयात करना है, इसलिए अपने घोड़े को केवल पढ़ने की क्षमताओं पर दौड़ में शामिल करना अनुचित लगता है; और xlsReadWrite
क्योंकि यह अब मेरे संस्करण के साथ संगत नहीं है R
(लगता है कि इसे चरणबद्ध किया गया है)।
फिर मैंने एक्सेल फ़ाइल आकार के संबंध में मतभेदों की अनुमति देने के लिए बेंचमार्क NN=1000L
और NN=25000L
( data.frame
ऊपर की प्रत्येक घोषणा से पहले बीज को रीसेट करना) चलाया । gc
मुख्य रूप से है xlsx
, जो मैंने कई बार पाया है कि मेमोरी क्लॉग बन सकता है। आगे की हलचल के बिना, यहां मुझे मिले परिणाम हैं:
1,000-पंक्ति एक्सेल फ़ाइल
benchmark1k <-
microbenchmark(times = 100L,
xlsx = {xlsx::read.xlsx2(fl, sheetIndex=1); invisible(gc())},
openxlsx = {openxlsx::read.xlsx(fl); invisible(gc())},
readxl = {readxl::read_excel(fl); invisible(gc())},
gdata = {gdata::read.xls(fl); invisible(gc())})
# Unit: milliseconds
# expr min lq mean median uq max neval
# xlsx 194.1958 199.2662 214.1512 201.9063 212.7563 354.0327 100
# openxlsx 142.2074 142.9028 151.9127 143.7239 148.0940 255.0124 100
# readxl 122.0238 122.8448 132.4021 123.6964 130.2881 214.5138 100
# gdata 2004.4745 2042.0732 2087.8724 2062.5259 2116.7795 2425.6345 100
तो प्रतिस्पर्धी और स्पष्ट हारने वाला readxl
विजेता है । न्यूनतम कॉलम के सापेक्ष प्रत्येक उपाय करना:openxlsx
gdata
# expr min lq mean median uq max
# 1 xlsx 1.59 1.62 1.62 1.63 1.63 1.65
# 2 openxlsx 1.17 1.16 1.15 1.16 1.14 1.19
# 3 readxl 1.00 1.00 1.00 1.00 1.00 1.00
# 4 gdata 16.43 16.62 15.77 16.67 16.25 11.31
हम अपने पसंदीदा देखते हैं, xlsx
की तुलना में 60% धीमी है readxl
।
25,000-रो एक्सेल फ़ाइल
समय की मात्रा के कारण, मैंने केवल 20 पुनरावृत्तियों को बड़ी फ़ाइल पर किया, अन्यथा कमांड समान थे। यहाँ कच्चे डेटा है:
# Unit: milliseconds
# expr min lq mean median uq max neval
# xlsx 4451.9553 4539.4599 4738.6366 4762.1768 4941.2331 5091.0057 20
# openxlsx 962.1579 981.0613 988.5006 986.1091 992.6017 1040.4158 20
# readxl 341.0006 344.8904 347.0779 346.4518 348.9273 360.1808 20
# gdata 43860.4013 44375.6340 44848.7797 44991.2208 45251.4441 45652.0826 20
यहाँ सापेक्ष डेटा है:
# expr min lq mean median uq max
# 1 xlsx 13.06 13.16 13.65 13.75 14.16 14.13
# 2 openxlsx 2.82 2.84 2.85 2.85 2.84 2.89
# 3 readxl 1.00 1.00 1.00 1.00 1.00 1.00
# 4 gdata 128.62 128.67 129.22 129.86 129.69 126.75
तो readxl
यह स्पष्ट विजेता है जब यह गति की बात आती है। gdata
बेहतर कुछ और इसके लिए जा रहा है, क्योंकि यह एक्सेल फ़ाइलों को पढ़ने में काफी धीमी है, और यह समस्या केवल बड़ी तालिकाओं के लिए समाप्त हो गई है।
दो ड्रॉ openxlsx
1 हैं) इसकी व्यापक अन्य विधियाँ ( केवल एक ही काम readxl
करने के लिए डिज़ाइन की गई है , जो शायद इसका हिस्सा है कि यह इतना तेज़ क्यों है), विशेष रूप से इसका कार्य, और 2) ( केवल इसके लिए एक और अधिक दोष ) में तर्क इस लेखन के) कुछ अमानक स्वीकार करता है : के बजाय और के बजाय ।write.xlsx
readxl
col_types
readxl
R
"text"
"character"
"date"
"Date"