2012-07-03 13 views
5

पढ़ने के लिए OLEDB का प्रदर्शन 2500 लाइनों और 5 कॉलम के साथ एक्सेल शीट पढ़ने के लिए i7- * 3.4 गीगाहर्ट्ज विंडोज -7 64-बिट कंप्यूटर पर 2500 मिलीसेकंड की तरह कोड लेता है। प्रत्येक सेल में लगभग 10 अक्षरों वाली स्ट्रिंग शामिल होती है। क्या यह सामान्य है? मैं इसे तेजी से कैसे पढ़ सकता हूं?एक्सेल

Stopwatch sw1 = Stopwatch.StartNew(); 
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " + 
              "Extended Properties=Excel 12.0;", filename); 

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); 
+2

डेटासेट "भारी" ऑब्जेक्ट्स हैं, बेहतर ढंग से अपनी खुद की कक्षा बनाएं और डेटरेडर – Boomer

+1

का उपयोग करके इसकी एक सूची भरें। मुझे लगता है कि अधिकांश प्रदर्शन लागत कनेक्शन समय है (रिकॉर्डसेट आकार को संशोधित करने का प्रयास करें ताकि यह देखने के लिए कि विलुप्त समय नाटकीय रूप से बढ़ता है) – Pynner

+0

आज़माएं कनेक्शन के बाद स्टॉपवॉच की शुरुआत को स्थानांतरित करने के लिए और देखें कि कैसे भाग लेने में उतना ही समय लगता है। लेकिन जैसा कि बूमर पहले से ही इंगित करता है, ओलेडबडाटा एडाप्टर और डेटासेट के बजाय ओलेडबकॉमैंड और ओलेडबडाटा रीडर का उपयोग करने का प्रयास करें और आपको कुछ गति भी मिल सकती है। –

उत्तर

6

मैं अपने निष्कर्षों को उत्तर के रूप में प्रस्तुत करना चाहता हूं क्योंकि व्यवहार हमेशा सुसंगत रहता है।

मैंने आपके कोड की प्रतिलिपि बनाई है और बटन क्लिक ईवेंट के अंदर रखा है, एडाप्टर को निपटाने और प्रत्येक परीक्षण के लिए कनेक्शन को सुनिश्चित करने के लिए बस थोड़ा सा बदल दिया है।

// 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 है()

+0

मैंने कभी सोचा नहीं था कि फाइल खोला जा रहा था। जवाब के लिए धन्यवाद। – hrzafer

+0

मैंने उस प्रोजेक्ट के साथ समान व्यवहार देखा जिस पर मैंने काम किया था, जो एक्सेल से बड़ी मात्रा में डेटा पढ़ता है। मैंने इस कारण को कम करने के लिए शोध नहीं किया, क्योंकि परियोजना को वास्तव में किसी भी तरह के प्रदर्शन की आवश्यकता नहीं थी (यह एक आंतरिक उपकरण है जो अभी भी एक मिनट के भीतर प्रसंस्करण समाप्त करता है)। मैंने निश्चित रूप से ध्यान दिया कि अगर मेरे पास स्प्रेडशीट खुली थी, तो इसे पूरा करने में एक मिनट तक लगना प्रतीत होता था जहां स्प्रेडशीट के साथ 10 सेकेंड लग गए थे। मैंने सोचा कि यह अजीब था, लेकिन इस पोस्ट की पुष्टि करता है कि मैं पागल नहीं हूं। – Jim