[英]SQLIte memory usage in C#
我有一個簡單的sqlite數據庫,其中只有一個表和7-8個帶有〜2.000.000條記錄的字符串字段。 磁盤上的數據庫文件約為450-500mb ...
當我在C#應用程序中打開db文件並執行簡單的“ select * from tbl”查詢時,計算機內存使用量將達到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 db嘗試了同樣的事情,並且該大小的數據庫的內存使用情況正常。 編輯:我試圖用Delphi XE5加載相同的sqlite數據庫,它僅使用〜600mb的內存。
有什么辦法可以避免這種情況?
這不是權威的答案,但我懷疑以下是您所看到的原因。
SQLite是一個進程內數據庫管理系統。 這樣,當您執行查詢以選擇2,000,000行表中的所有記錄的查詢時,實際上是將所有數據加載到內存中,而這些開銷完全來自SQLite用於引用數據的任何索引數據結構。
與此相反,MySQL是作為獨立進程運行的。 當您通過MySQL數據訪問驅動程序將SELECT * FROM ..
查詢發送到MySQL時,很可能並不會一次發送回所有數據,而是通過逐步讀取下一條記錄而逐漸返回結果一個DataReader。
在C#.net Framework 4.0之前,我遇到了相同的問題,這是我的觀察結果。
如果您同時(使用線程)在SQLite上執行大量進程,則會造成很大的開銷,因為SQLite鎖定整個數據庫,因為它一次只能處理一個進程。
我要解決此問題的變通辦法是專注於在CRUD操作期間使用事務和使用准備好的語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.