簡體   English   中英

C#中的SQLIte內存使用情況

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM