Bir Excel dosyasını okumanın farklı yollarının çoğalması R
ve buradaki yanıtların bolluğu göz önüne alındığında, burada bahsedilen seçeneklerden hangisinin en iyi performansı gösterdiğine ışık tutmaya çalışacağımı düşündüm (birkaç basit durumda).
Kullanmaya xlsx
başladığımdan beri R
, başka hiçbir şey olmasa bile atalet için kullanıyorum ve son zamanlarda hangi paketin daha iyi çalıştığına dair herhangi bir objektif bilgi olmadığını fark ettim.
Bazı paketler belirli durumları diğerlerinden daha iyi ele aldığından ve diğer uyarılardan oluşan bir şelale olduğundan, herhangi bir kıyaslama alıştırması zorluklarla doludur.
Bununla birlikte, oldukça yaygın bir biçimde olduğunu düşündüğüm (yeniden üretilebilir) bir veri kümesi kullanıyorum (8 dize alanı, 3 sayısal, 1 tam sayı, 3 tarih):
set.seed(51423)
data.frame(
str1 = sample(sprintf("%010d", 1:NN)),
str2 = sample(sprintf("%09d", 1:NN)),
str3 =
replicate(NN, paste0(sample(LETTERS, sample(10:30, 1L), TRUE),
collapse = "")),
str4 = sprintf("%05d", sample(sample(1e5, 50L), NN, TRUE)),
str5 =
sample(replicate(17L, paste0(sample(LETTERS, sample(15:25, 1L), TRUE),
collapse = "")), NN, TRUE),
num1 = round(exp(rnorm(NN, mean = 6.5, sd = 1.5)), 2L),
str6 = sample(c("Y","N"), NN, TRUE),
str7 = sample(c("M","F"), NN, TRUE),
str8 = sample(c("B","W"), NN, TRUE),
int1 = ceiling(rexp(NN)),
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),
dat3 =
sample(seq(from = as.Date("2015-06-01"),
to = as.Date("2015-07-15"), by = "day"),
NN, TRUE),
num3 =
(-1) ^ sample(2, NN, TRUE) * round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L)
)
Sonra sonra bu parçacığı belirtilen paketlerin 4 benchmarked, csv bu yazmış ve LibreOffice açıldı ve bir .xlsx dosyası olarak kaydedilir: xlsx
, openxlsx
, readxl
, ve gdata
, varsayılan seçenekleri kullanarak (Ben de bir sürümünü denedik olsun veya olmasın ben sütun türlerini belirtin, ancak bu sıralamaları değiştirmedi).
Dışlıyorum RODBC
çünkü Linux'tayım; XLConnect
çünkü birincil amacı tek Excel sayfalarında okumak değil, tüm Excel çalışma kitaplarını içe aktarmak gibi görünüyor, bu nedenle yarışa sadece okuma yeteneklerini koymak haksız görünüyor; ve xlsReadWrite
artık benim sürümümle uyumlu olmadığı için R
(aşamalı olarak kullanımdan kaldırılmış gibi görünüyor).
Daha sonra Excel dosya boyutuna göre farklılıklara izin vermek için NN=1000L
ve NN=25000L
( data.frame
yukarıdaki her bildirimden önce tohumu sıfırlayarak) ile karşılaştırmalar yaptım . gc
Öncelikle xlsx
bulduğum için, zaman zaman bellek tıkanıklıkları oluşturabilir. Daha fazla uzatmadan bulduğum sonuçlar şunlardır:
1.000 Satır Excel Dosyası
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())})
Rekabetçi ve açık bir kaybedenle readxl
kazanan da öyle . Her ölçüyü minimum sütuna göre almak:openxlsx
gdata
Kendi favorimin xlsx
% 60 daha yavaş olduğunu görüyoruz readxl
.
25.000 Satır Excel Dosyası
Aldığı süre nedeniyle büyük dosyada yalnızca 20 tekrar yaptım, aksi takdirde komutlar aynıydı. İşte ham veriler:
İşte göreceli veriler:
Yani readxl
bu hıza gelince eşi yoktur. gdata
Excel dosyalarını okumada acı verici bir şekilde yavaş olduğundan ve bu sorun yalnızca daha büyük tablolarda daha da arttığından, bunun için başka bir şey yapsanız iyi olur.
İki çekiliş openxlsx
şunlardır: 1) kapsamlı diğer yöntemleri ( muhtemelen neden bu kadar hızlı olduğunun bir parçası olan tek bir şeyi readxl
yapmak için tasarlanmıştır ), özellikle de write.xlsx
işlevi ve 2) (daha çok dezavantajı readxl
) col_types
argümanın readxl
yalnızca ( Bu yazı) bazı standart olmayanları kabul eder R
: "text"
yerine "character"
ve "date"
yerine "Date"
.