動作が常に一貫しているため、私は答えとして自分の所見を提示したいと思います。
私はあなたのコードをコピーし、ボタンクリックイベントの中に入れました。ちょっと変わって、すべてのテストのためにアダプタと接続を確実に破棄してください。
// 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を使ってみてください。 –