【问题标题】:SQLIte memory usage in C#C# 中的 SQLIte 内存使用情况
【发布时间】:2014-01-20 16:54:38
【问题描述】:

我有一个简单的 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 的内存。

有什么办法可以避免吗?

【问题讨论】:

    标签: c# sqlite memory


    【解决方案1】:

    这不是对此的权威答案,但我怀疑以下是您所看到的原因。

    SQLite 是一个进程内数据库管理系统。因此,当您执行选择 2,000,000 行表中的所有记录的查询时,您实际上是在将所有数据加载到内存中,并且会产生 SQLite 用于引用数据的任何索引数据结构的开销。

    将其与作为单独进程运行的 MySQL 进行对比。最有可能的是,当您通过 MySQL 数据访问驱动程序向 MySQL 发送 SELECT * FROM .. 查询时,它并没有真正一次将所有数据发送回,而是您只是逐渐返回结果,因为您阅读 通过 DataReader 的下一条记录。

    【讨论】:

    • 你说得对。关于 SqlLite 文件本身的大小,它非常大,需要完全加载到内存中(我不确定),但奇怪的是为什么他的计算机达到 3GB 的内存负载?它真的很奇怪。我现在尝试在一个空白的 C#.NET 项目 4.0 上读取一个 1.2GB 的旧 SQLlite 文件。在我的计算机内存中它只消耗 ~80MB
    【解决方案2】:

    我之前在使用 C#.net 框架 4.0 时遇到过同样的问题,这是我的观察结果。

    如果您同时在 SQLite 上执行大量进程(使用线程),则会产生很大的开销,因为 SQLite 会锁定整个数据库,因为它一次只能处理一个进程。

    我来解决这个问题的解决方法是专注于在 CRUD 操作期间使用事务和使用准备好的语句。

    【讨论】:

    • 除了单个“选择”查询之外,我什么也没做。我将添加一些代码来澄清问题。
    猜你喜欢
    • 2010-10-19
    • 2020-12-19
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多