मैं अपने निष्कर्षों को उत्तर के रूप में प्रस्तुत करना चाहता हूं क्योंकि व्यवहार हमेशा सुसंगत रहता है।
मैंने आपके कोड की प्रतिलिपि बनाई है और बटन क्लिक ईवेंट के अंदर रखा है, एडाप्टर को निपटाने और प्रत्येक परीक्षण के लिए कनेक्शन को सुनिश्चित करने के लिए बस थोड़ा सा बदल दिया है।
// test.xls contains 26664 rows by 5 columns. Average 10 char for column, file size is 2448kb
// OS Windows 7 Ultimate 64 bit. CPU Intel Core2 Quad Q9550 2.83ghz
// 8gb ram and disk C is an 256gb SSD cruzer
private void button1_Click(object sender, EventArgs e)
{
string filename = "c:\\tmp\\test.xls";
Stopwatch sw1 = Stopwatch.StartNew();
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " +
"Extended Properties=Excel 12.0", filename);
using(var adapter = new OleDbDataAdapter("SELECT * FROM [roots$]", connectionString))
{
var ds = new DataSet();
adapter.Fill(ds, "roots");
sw1.Stop();
Console.WriteLine("Time taken for excel roots: {0} ms", sw1.Elapsed.TotalMilliseconds);
}
}
तो, यह मूल रूप से आपका कोड है। यह कोड 500ms में निष्पादित करता है। लेकिन .... अगर मैं Excel 2010 में फ़ाइल test.xls खोलता हूं, तो निष्पादन समय 8000ms तक कूद जाता है।
मैं भी इस कोड भिन्नता की कोशिश की है, लेकिन अंत परिणाम एक ही
private void button1_Click(object sender, EventArgs e)
{
string filename = "c:\\tmp\\test.xls";
Stopwatch sw1 = Stopwatch.StartNew();
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " +
"Extended Properties=Excel 12.0", filename);
using(OleDbConnection cn = new OleDbConnection(connectionString))
{
cn.Open();
using(var adapter = new OleDbDataAdapter("SELECT * FROM [roots$]", cn))
{
var ds = new DataSet();
adapter.Fill(ds, "roots");
sw1.Stop();
Console.WriteLine("Time taken for excel roots: {0} ms", sw1.Elapsed.TotalMilliseconds);
}
}
}
कर रहे हैं और, नहीं, यह OleDbConnection का ओपन() नहीं है, हमेशा adapter.Fill है()
डेटासेट "भारी" ऑब्जेक्ट्स हैं, बेहतर ढंग से अपनी खुद की कक्षा बनाएं और डेटरेडर – Boomer
का उपयोग करके इसकी एक सूची भरें। मुझे लगता है कि अधिकांश प्रदर्शन लागत कनेक्शन समय है (रिकॉर्डसेट आकार को संशोधित करने का प्रयास करें ताकि यह देखने के लिए कि विलुप्त समय नाटकीय रूप से बढ़ता है) – Pynner
आज़माएं कनेक्शन के बाद स्टॉपवॉच की शुरुआत को स्थानांतरित करने के लिए और देखें कि कैसे भाग लेने में उतना ही समय लगता है। लेकिन जैसा कि बूमर पहले से ही इंगित करता है, ओलेडबडाटा एडाप्टर और डेटासेट के बजाय ओलेडबकॉमैंड और ओलेडबडाटा रीडर का उपयोग करने का प्रयास करें और आपको कुछ गति भी मिल सकती है। –