2011-03-10 174 views
4

我試圖從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。

+0

你確定,'begin'和'end'命令正在工作嗎?如果刪除它們,您是否注意到執行時間有變化? – 2011-03-10 10:05:46

+0

謝謝。是的,他們似乎在工作。我現在嘗試,沒有他們,至少需要10分鐘(15秒)...我也嘗試了transaction = connection.BeginTransaction()/。transaction.commit方式(理性表現如上)。 – DougF 2011-03-10 10:56:15

+0

好的。只是想要得到確認。因爲我打算建議使用Transaction或TransactionScope ...但這不會解決您的問題,比...... – 2011-03-10 10:57:27

回答

1

所以我想我已經解決了這個問題 - 至少找到了解決方案。

因爲我會用盡我的所有代碼的選擇(它看起來並不像任何人都有一個答案/問題,我的代碼),我決定的問題可能在於數據庫本身內...

我已經在SQLite Manager Firefox Plugin中創建了我的數據庫和表格。

所以我重新創建了一切,從命令shell和BOOM!我的進口下降到幾秒鐘!

我知道有一個問題,它無法處理64位整數(但只是使用TEXT數據類型)。也許SQLite Manager使用不同的.net版本的SQLite引擎存在問題?我不知道。

我的下一步可能是從我的應用程序中實際創建db +表,而不是讓它們事先準備好......但我現在對性能非常滿意,所以這不是優先事項。