จากการเพิ่มจำนวนของวิธีต่างๆในการอ่านไฟล์ Excel R
และคำตอบมากมายที่นี่ฉันคิดว่าฉันจะพยายามอธิบายว่าตัวเลือกใดที่กล่าวถึงในที่นี้ทำงานได้ดีที่สุด (ในสถานการณ์ง่ายๆไม่กี่อย่าง)
ตัวฉันเองใช้xlsx
มาตั้งแต่เริ่มใช้R
สำหรับความเฉื่อยถ้าไม่มีอะไรอื่นและเมื่อเร็ว ๆ นี้ฉันสังเกตว่าดูเหมือนจะไม่มีข้อมูลวัตถุประสงค์ใด ๆ ว่าแพ็คเกจใดทำงานได้ดีกว่า
แบบฝึกหัดการเปรียบเทียบใด ๆ ล้วนเต็มไปด้วยความยากลำบากเนื่องจากบางแพ็กเกจมั่นใจว่าจะรับมือกับสถานการณ์บางอย่างได้ดีกว่าแบบอื่น ๆ และน้ำตกแห่งคำเตือนอื่น ๆ
ที่กล่าวว่าฉันกำลังใช้ชุดข้อมูล (ทำซ้ำได้) ที่ฉันคิดว่าอยู่ในรูปแบบทั่วไป (8 ช่องสตริง, 3 ตัวเลข, 1 จำนวนเต็ม, 3 วันที่):
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)
)
จากนั้นผมก็เขียนนี้เป็น CSV และเปิดใน LibreOffice และบันทึกเป็นไฟล์ .xlsx แล้ว benchmarked 4 แพคเกจที่กล่าวถึงในกระทู้นี้: xlsx
, openxlsx
, readxl
และgdata
ใช้ตัวเลือกเริ่มต้น (ฉันยังพยายามรุ่นของหรือไม่ว่าฉัน ระบุประเภทคอลัมน์ แต่ไม่ได้เปลี่ยนการจัดอันดับ)
ฉันไม่รวมRODBC
เพราะฉันใช้ลินุกซ์ XLConnect
เนื่องจากดูเหมือนว่าจุดประสงค์หลักไม่ได้อ่านในแผ่นงาน Excel แผ่นเดียว แต่นำเข้าสมุดงาน Excel ทั้งหมดดังนั้นการที่จะนำม้าเข้ามาแข่งขันกับความสามารถในการอ่านเท่านั้นดูเหมือนจะไม่ยุติธรรม และxlsReadWrite
เนื่องจากไม่สามารถใช้งานร่วมกับเวอร์ชันของฉันได้อีกต่อไปR
(ดูเหมือนว่าจะถูกยกเลิกไปแล้ว)
จากนั้นฉันก็รันการวัดประสิทธิภาพด้วยNN=1000L
และNN=25000L
(รีเซ็ตเมล็ดพันธุ์ก่อนการประกาศdata.frame
ข้างต้นแต่ละครั้ง) เพื่อให้มีความแตกต่างเกี่ยวกับขนาดไฟล์ Excel gc
เป็นหลักxlsx
ซึ่งฉันพบว่าบางครั้งอาจทำให้หน่วยความจำอุดตัน โดยไม่ต้องกังวลใจต่อไปนี้คือผลลัพธ์ที่ฉันพบ:
ไฟล์ Excel 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())})
ดังนั้นreadxl
จะเป็นผู้ชนะด้วยopenxlsx
การแข่งขันและgdata
ผู้แพ้ที่ชัดเจน การวัดแต่ละครั้งเทียบกับคอลัมน์ต่ำสุด:
เราเห็นที่ชื่นชอบของตัวเองxlsx
เป็น 60% readxl
ช้ากว่า
ไฟล์ Excel 25,000 แถว
เนื่องจากระยะเวลาที่ใช้ฉันทำซ้ำเพียง 20 ครั้งในไฟล์ขนาดใหญ่มิฉะนั้นคำสั่งจะเหมือนกัน นี่คือข้อมูลดิบ:
นี่คือข้อมูลสัมพัทธ์:
ดังนั้นจึงreadxl
เป็นผู้ชนะที่ชัดเจนในเรื่องความเร็ว gdata
ดีกว่ามีอย่างอื่นให้ทำเนื่องจากการอ่านไฟล์ Excel ช้าลงอย่างเจ็บปวดและปัญหานี้รุนแรงขึ้นสำหรับตารางขนาดใหญ่เท่านั้น
การดึงสองครั้งopenxlsx
คือ 1) วิธีการอื่น ๆ ที่กว้างขวาง ( readxl
ออกแบบมาเพื่อทำเพียงสิ่งเดียวซึ่งอาจเป็นส่วนหนึ่งของสาเหตุที่มันเร็วมาก) โดยเฉพาะอย่างยิ่งการwrite.xlsx
ทำงานของมันและ 2) (ข้อเสียเปรียบสำหรับreadxl
) col_types
อาร์กิวเมนต์ในreadxl
เท่านั้น (as ที่เขียนนี้) ยอมรับมาตรฐานบางR
: "text"
แทน"character"
และแทน"date"
"Date"