나는 행동이 항상 일관 적이기 때문에 대답으로 대답을 제시하고자합니다.
코드를 복사하고 버튼 클릭 이벤트에 넣고 모든 테스트에 대해 어댑터와 연결을 처리하기 위해 비트를 약간 변경했습니다.
// 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
시도해보십시오 연결이 이루어진 후 StopWatch의 시작 부분으로 이동하고 그 부분이 소요되는 많은 시간. Boomer가 이미 지적했듯이 OleDbDataAdapter와 DataSet 대신 OleDbCommand와 OleDbDataReader를 사용하면 꽤 빠른 속도를 얻을 수 있습니다. –