C# - SQLite不断存储少量数据

时间:2017-12-04 13:00:37

标签: c# sqlite

我的设置:

  • 使用Parallel.ForEach设置为40个线程的多线程应用程序。
  • 将foreach的索引添加到每个循环的concurrentbag中。
  • 一旦将其添加到包中,就将string.joins()与它们一起发送,并将其发送到SQLite表。 (它大约有14个循环/秒,有时更多)。

它可以工作,但CPU无法忍受。然后是80-90的峰值到10~然后回来并循环。我删除.CommandText和.ExeecuteNonQueryAsync的那一刻它几乎没有超过4%。

CPU使用率调试窗口的屏幕截图:

Screenshot of the CPU Usage Debug Window

为什么我上面的设置是将每个循环的已检查索引存储在一个hashset上,这样当我关闭,重新打开并重新启动该循环时,它知道我已经循环的索引,以便我可以从hashset中删除它们并在没有这些索引的情况下继续循环。

有没有更好的方法来做我正在做的事情?

我在ForEach中执行的代码:

looper_checkedIndexes.Add(Index);
using (SQLiteCommand command = sqldb.CreateCommand()) {
    command.CommandText = "UPDATE `timeMachine` SET `indexes`='" + string.Join(",", looper_checkedIndexes) + "' WHERE `config`='" + General["name"].ToString().Replace("'", "\\'") + "'";
    command.ExecuteNonQueryAsync();
}

1 个答案:

答案 0 :(得分:0)

加速许多小写操作的最佳方法是将它们合并为一个事务,和/或使用WAL mode