2014-01-20 52 views
0

我有一個簡單的sqlite數據庫只有一個表和7-8字符串字段與〜2.000.000記錄。磁盤上的數據庫文件是關於450-500mb ...SQLIte內存使用C#

當我打開我的C#應用​​程序數據庫文件和執行簡單的「從TBL SELECT *」查詢,計算機內存使用去3GB。

這裏是代碼我使用從數據庫中選擇數據:

 DataSet ds = new DataSet(); 
     dataGridView1.DataSource = null; 
     string s = Cstr(); 
     try 
     { 

      SQLiteConnection conn = new SQLiteConnection(s); 
      SQLiteCommand command = new SQLiteCommand(conn); 
      command.CommandText = "select * from log;"; 
      conn.Open(); 
      command.ExecuteReader(); 
      var da = new SQLiteDataAdapter(command.CommandText, conn); 
      da.Fill(ds); 

      dataGridView1.DataSource = ds.Tables[0]; 
      conn.Close(); 
      GC.Collect(); 

     } 
     catch (Exception) 
     { 
     } 

我試着用MYSQL5數據庫和內存使用同樣的事情是正常的,這種規模的數據庫。 編輯: 我試圖加載與Delphi XE5相同的SQLite數據庫,它只使用〜600MB的內存。

有什麼辦法可以避免這種情況?

回答

3

這是不是這方面的權威答案,但我懷疑,以下是你所看到的原因。

SQLite是一個進程內數據庫管理系統。因此,當您執行選擇2,000,000行表中的所有記錄的查詢時,實質上就是將所有這些數據加載到內存中,並完成來自SQLite用來引用數據的索引數據結構的開銷。

與作爲單獨進程運行的MySQL相比。最有可能的,當你通過MySQL的數據訪問驅動程序發送一個SELECT * FROM ..查詢到MySQL它並沒有真正發回的所有數據一次,而是你只獲得返回結果漸漸地,你通過一個DataReader讀下一條記錄。

+1

好吧,你有重點。關於SqlLite文件本身的大小,它非常大,需要完全加載到內存中(我不確定),但有一點奇怪的是他的計算機達到3GB的內存負載的原因?它真的很奇怪。我現在試着用一個空白的C#.NET項目4.0讀取一個1.2GB的舊SQLlite文件。在我的電腦內存中它只消耗〜80MB –

0

我用C#.NET Framework 4.0中遇到過同樣的問題,在這裏是我的意見。

,如果你在同一時間(使用線程),因爲SQLite的鎖定整個數據庫,因爲它只能同時處理一個過程中,您將創建一筆大開銷做了很多工藝上的SQLite。

我來解決這個問題的解決方法是全身心的過程中CRUD操作使用事務和使用預處理語句。

+0

我沒有做任何事情,除了單一的「選擇」查詢。我會添加一些代碼來澄清問題。 –