Bir Excel dosyasını okumanın farklı yollarının çoğalması Rve 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 xlsxbaş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 xlsReadWriteartı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=1000Lve NN=25000L( data.frameyukarıdaki her bildirimden önce tohumu sıfırlayarak) ile karşılaştırmalar yaptım . gcÖncelikle xlsxbulduğ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 readxlkazanan da öyle . Her ölçüyü minimum sütuna göre almak:openxlsxgdata
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 readxlbu hıza gelince eşi yoktur. gdataExcel 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 readxlyapmak için tasarlanmıştır ), özellikle de write.xlsxişlevi ve 2) (daha çok dezavantajı readxl) col_typesargümanın readxlyalnızca ( Bu yazı) bazı standart olmayanları kabul eder R: "text"yerine "character"ve "date"yerine "Date".