এখানে এক্সেল ফাইল এবং 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
কারণ মনে হচ্ছে এর প্রাথমিক উদ্দেশ্যটি সিঙ্গল এক্সেল শিটগুলিতে পড়া নয়, পুরো এক্সেল ওয়ার্কবুকগুলি আমদানি করা, তাই কেবল তার পড়ার ক্ষমতার প্রতিযোগিতায় ঘোড়া চালানো অন্যায় বলে মনে হচ্ছে; এবং 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())})
প্রতিযোগিতামূলক এবং একটি স্পষ্ট পরাজয়ের readxl
সাথে বিজয়ীও তাই । সর্বনিম্ন কলামের সাথে প্রতিটি পরিমাপ গ্রহণ করা:openxlsx
gdata
আমরা আমার নিজের পছন্দ দেখতে পাই, এর xlsx
চেয়ে 60০% ধীর readxl
।
25,000-রো এক্সেল ফাইল
যত সময় লাগে তার কারণে আমি কেবলমাত্র বড় ফাইলটিতে 20 টি পুনরাবৃত্তি করেছি, অন্যথায় আদেশগুলি অভিন্ন ছিল। কাঁচা তথ্য এখানে:
আপেক্ষিক ডেটা এখানে:
সুতরাং readxl
স্পষ্ট বিজয়ী যখন এটি গতি আসে। gdata
এক্সেল ফাইলগুলি পড়ার ক্ষেত্রে এটি বেদনাদায়কভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কমে যায় এবং এই সমস্যাটি কেবল বৃহত্তর টেবিলগুলির জন্যই বাড়িয়ে তোলে।
দুটি অঙ্কন হ'ল openxlsx
এর 1) এর বিস্তৃত অন্যান্য পদ্ধতিগুলি ( কেবলমাত্র একটি কাজ readxl
করার জন্য ডিজাইন করা হয়েছে , এটি সম্ভবত এটি এত দ্রুত কেন এটির একটি অংশ), বিশেষত এটির কার্যকারিতা এবং 2) ( কেবলমাত্র হিসাবে একটি তর্ক ) এই লেখার) কিছু অমানুষ গ্রহণ করে : পরিবর্তে এবং পরিবর্তে ।write.xlsx
readxl
col_types
readxl
R
"text"
"character"
"date"
"Date"