2012-07-03 14 views
5

Il seguente codice impiega 2500 millisecondi su un computer windows-7 a 64 bit i7- * 3,4 GHz per leggere un foglio Excel con 25000 righe e 5 colonne. Ogni cella include all'incirca una stringa con 10 caratteri. È normale? Come posso leggerlo più velocemente?Prestazioni di OLEDB per leggere Excel

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

set di dati sono oggetti "pesanti", meglio creare la tua classe e riempire un elenco di esso utilizzando datareader – Boomer

+1

Penso che la maggior parte del costo delle prestazioni è il tempo di connessione (prova a modificare le dimensioni del recordset per vedere se il tempo trascorso aumenta drasticamente) – Pynner

+0

Prova per spostare l'inizio dello StopWatch su dopo aver effettuato la connessione e vedere come molto tempo che questa parte richiede. Ma come già sottolineato da Boomer, prova ad utilizzare OleDbCommand e OleDbDataReader invece di OleDbDataAdapter e un DataSet e potresti anche guadagnare un po 'di velocità. –

risposta

6

Desidero presentare le mie conclusioni come risposta perché il comportamento è sempre coerente.

Ho copiato il codice e inserito un evento click del pulsante, appena cambiato un po 'per essere sicuro di disporre dell'adattatore e della connessione per ogni test effettuato.

// 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); 
     } 
    } 

Quindi, questo è fondamentalmente il tuo codice. Questo codice viene eseguito in 500 ms. MA .... se tengo il file test.xls aperto in Excel 2010, il tempo di esecuzione salta a 8000 ms.

Ho anche provato questa variante di codice, ma i risultati finali sono gli stessi

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); 
      } 
     } 
    } 

e, no, non è l'Open() del OleDbConnection, è sempre l'adapter.Fill()

+0

Non ho mai pensato che il motivo fosse l'apertura del file. Grazie per la risposta. – hrzafer

+0

Ho notato un comportamento simile con un progetto su cui ho lavorato che legge grandi quantità di dati da Excel. Non ho fatto il tipo di ricerca per restringere la causa, perché il progetto non richiedeva alcun tipo di performance (è uno strumento interno che termina ancora l'elaborazione in meno di un minuto). Ho notato per certo che se avessi aperto il foglio di lavoro, sembrava che ci volesse un minuto per completare dove avrebbe potuto impiegare 10 secondi con il foglio di calcolo non aperto. Ho pensato che fosse strano, ma questo post mi conferma che non sono pazzo. – Jim

Problemi correlati