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