我有一个使用对象集合的应用程序非常快。 现在,我正在添加一个用于持久化的数据库,所以我开始在SQLite数据库中保存。
但现在我发现的要慢得多。 我认为这是因为磁盘比ram慢。可以将DB放在内存中吗? 我在SQLite的文档中找到了Inmemory DB,但它在内存中,我需要坚持不懈。
那么,是否可以将内存中的数据库用于执行并在一段时间后保存到磁盘?
谢谢你和问候。
更新
在答案中他们说这是因为我做了很多插入,这是真的。他们说我应该批量插入。
我的代码在名为Computers:
的内存集合中看起来像这样foreach (line in lines)
{
Computers.Add(new Computer { ComputerName = line});
}
现在在DB中:
foreach (line in lines)
{
string sql = "INSERT into computers VALUES ('"+computerName+"')";
SQLiteCommand command = new SQLiteCommand(sql, dbConnection); command.ExecuteNonQuery();
}
如何在单个批量插入中执行此操作?
答案 0 :(得分:2)
您可以使用Backup API来完成此任务。请参阅http://www.sqlite.org/backup.html提供了C中的完整代码示例。
如果您要同时执行大量插入操作,请确保将它们组合在一个事务中。否则SQLite会为每个插入等待一次磁盘旋转,这会大大减慢插入过程。这样做可能允许您使用基于磁盘的SQLite数据库,而不会减速。
答案 1 :(得分:0)
如果内存中有数据库并且偶尔将其刷新到磁盘,则会丢失数据库中最重要的功能之一,即ACID。换句话说,你的应用程序可以编写认为它是持久的数据,然后一个后续问题可能会导致你丢失数据。
如果有足够的RAM可供数据库缓存经常访问的项目,许多数据库的性能都会很好(尽管仍然比RAM内解决方案慢得多)。
首先检查与数据库的交互中哪些确实很慢。您是否正在获取不会一遍又一遍变化的数据?也许缓存在数据库中?您是否对数据库进行了许多单独的更新,这些更新可以合并为一个更新?