c – 配置SQLite以进行实时操作
简而言之,这篇文章想回答以下问题:如何(如果可能的话)我们如何配置SQLite数据库以确保任何INSERT命令将在不到8毫秒内返回?
通过configure,我的意思是:编译选项,数据库编译指示选项和运行时选项. 为了给出一些背景知识,我们希望以120 fps应用相同的INSERT语句. (1000毫秒/ 120fps?8毫秒) 使用以下字符串创建数据库: "CREATE TABLE IF NOT EXISTS MYTABLE (" "int1 INTEGER PRIMARY KEY AUTOINCREMENT," "int2 INTEGER," "int3 INTEGER," "int4 INTEGER," "fileName TEXT); 和选项: "PRAGMA SYNCHRONOUS=NORMAL;" "PRAGMA JOURNAL_MODE=WAL;" INSERT语句如下: INSERT INTO MYTABLE VALUES (NULL,?,?) 最后 ? (对于fileName)是文件的名称,因此它是一个小字符串.因此每个INSERT都很小. 当然,我使用预编译语句来加速这个过程. 我有一个小程序,每8毫秒插入一次,并测量执行此插入所需的时间.更确切地说,程序进行一次插入,然后等待8 ms,然后进行另一次插入等…最后,推送了7200个插入,因此程序运行大约1分钟. 以下是显示两个图表的两个链接: 此图显示了插入所花费的毫秒数与以分钟表示的时间的函数关系.正如您所看到的,大多数情况下,插入时间为0,但是有超过100毫秒的峰值. 该图像是相同数据的直方图表示.所有低于5毫秒的值都没有表示,但我可以告诉你,从7200插入,7161低于5毫秒(并且会在0处产生一个巨大的峰值,这会使图表的可读性降低). 总计划时间是 我们说这是1分4秒.别忘了我们花了7200倍8毫秒等待.所以7200插件需要4秒—>我们的速率为每秒1800个插入,因此每个插入的平均时间为0.55毫秒. 那么这些高峰来自哪里呢? 当WAL文件达到??给定大小(在我们的例子中为1MB)时,SQLite会生成一个检查点(WAL文件应用于真实数据库文件).因为我们通过PRAGMA SYNCHRONOUS = NORMAL,所以此时,SQLite在硬盘上执行fsync. 我们也试过PRAGMA SYNCHRONOUS = OFF.表现更好但仍然不够. 有没有人有想法以及如何“平滑”图表,这意味着所有插入时间都不会超过8毫秒? 解决方法
默认情况下,SQLite中的所有内容都针对吞吐量而非延迟进行了优化.
WAL模式将大多数延迟移动到检查点,但如果您不想要那些大的延迟,则必须使用更频繁的检查点,即在每次交易后执行检查点. 如果WAL /日志操作太慢,并且即使synchronous = off还不够快,那么您唯一的选择是禁用事务安全性并尝试journal_mode = memory或even = off. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |