繁体   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