我試圖從csv文件導入到sqlite表中的數據。我的測試數據只有8Mb(50,000行),大約需要15秒。然而生產數據幾乎是400Mb,並且需要永久(至少30分鐘+,我放棄了等待)。在SQLite緩慢批量/批量插入
經過大量研究,我發現需要在單個事務中完成插入操作(這讓我得到了15秒的導入,很棒的建議!:))所以這不是問題。 (AFAIK)
我也根據這個Robert Simpson post和許多變化在參數化INSERT語句上使用「ExecuteNonQuery()」。
我只是用TextReader.ReadLine()
和String.Split('\t')
,然後我讀的地方約ReadLine()
由於磁盤的讀取次數是緩慢的,所以我看着讀bufferedStream,和整個this csv reader來了。但仍然沒有明顯的性能變化。
所以,我評論了我的插入循環的膽量和閱讀發生在即時附近 - 所以我相信這個問題是在我插入。我已經嘗試了創建參數化查詢+單個事務的衆多變體,但都具有幾乎相同的結果..
下面是我的代碼的常規版本。在此先感謝,這使我瘋狂!我準備嘗試導入到數據集和插入的是....
using (TextReader tr = File.OpenText(cFile))
{
using (SQLiteConnection cnn = new SQLiteConnection(connectionString))
{
string line;
string insertCommand = "INSERT INTO ImportTable VALUES (@P0,@P1,@P2,@P3,@P4)";
cnn.Open();
SQLiteCommand cmd = new SQLiteCommand("begin", cnn);
cmd.ExecuteNonQuery();
cmd.CommandText = insertCommand;
while ((line = tr.ReadLine()) != null)
{
string[] items = line.Split('\t');
cmd.Parameters.AddWithValue("@P0", items[0]);
cmd.Parameters.AddWithValue("@P1", items[1]);
cmd.Parameters.AddWithValue("@P2", items[2]);
cmd.Parameters.AddWithValue("@P3", items[3]);
cmd.Parameters.AddWithValue("@P4", items[4]);
cmd.ExecuteNonQuery();
}
cmd.CommandText = "end";
cmd.ExecuteNonQuery();
}
}
更新:我只是使用帶有參數插件(只是硬編碼一些值),小於5秒試過.. 。仍然沒有我見過的文章那麼快...
另外,我正在運行Core 2 Duo(3Ghz)和2G Ram,XP。
你確定,'begin'和'end'命令正在工作嗎?如果刪除它們,您是否注意到執行時間有變化? – 2011-03-10 10:05:46
謝謝。是的,他們似乎在工作。我現在嘗試,沒有他們,至少需要10分鐘(15秒)...我也嘗試了transaction = connection.BeginTransaction()/。transaction.commit方式(理性表現如上)。 – DougF 2011-03-10 10:56:15
好的。只是想要得到確認。因爲我打算建議使用Transaction或TransactionScope ...但這不會解決您的問題,比...... – 2011-03-10 10:57:27