2012-07-03 2 views
5

다음 코드는 i7- * 3.4GHz Windows-7 64 비트 컴퓨터에서 2500 밀리 초와 비슷한 속도로 25000 줄과 5 열의 Excel 시트를 읽습니다. 각 셀에는 약 10 자의 문자열이 포함됩니다. 정상입니까? 어떻게 빨리 읽을 수 있습니까?Excel을 읽는 OLEDB의 성능

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

시도해보십시오 연결이 이루어진 후 StopWatch의 시작 부분으로 이동하고 그 부분이 소요되는 많은 시간. Boomer가 이미 지적했듯이 OleDbDataAdapter와 DataSet 대신 OleDbCommand와 OleDbDataReader를 사용하면 꽤 빠른 속도를 얻을 수 있습니다. –

답변

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

Excel에서 많은 양의 데이터를 읽는 프로젝트에서 비슷한 동작을 감지했습니다. 프로젝트가 실제로 어떤 종류의 성능도 필요로하지 않았기 때문에 그 원인을 좁히기 위해 일종의 연구를하지 않았습니다. (이것은 잠시 후에 처리가 끝나는 내부 도구입니다.) 스프레드 시트를 열어 놓은 상태에서 스프레드 시트를 열지 않은 상태에서 10 초가 걸릴 수도있는 장소를 완료하는 데 1 분 정도 걸리는 것으로 보였습니다. 나는 그것이 이상하다고 생각했다. 그러나이 지위 종류는 내가 미쳤다는 것을 확인한다. – Jim

관련 문제