加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 配置SQLite以进行实时操作

发布时间:2020-12-16 07:08:22 所属栏目:百科 来源:网络整理
导读:简而言之,这篇文章想回答以下问题:如何(如果可能的话)我们如何配置SQLite数据库以确保任何INSERT命令将在不到8毫秒内返回? 通过configure,我的意思是:编译选项,数据库编译指示选项和运行时选项. 为了给出一些背景知识,我们希望以120 fps应用相同的INSERT
简而言之,这篇文章想回答以下问题:如何(如果可能的话)我们如何配置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处产生一个巨大的峰值,这会使图表的可读性降低).

总计划时间是
????真正的1m2.286s
????用户0m1.228s
????sys 0m0.320s.

我们说这是1分4秒.别忘了我们花了7200倍8毫秒等待.所以7200插件需要4秒—>我们的速率为每秒1800个插入,因此每个插入的平均时间为0.55毫秒.
这真的很棒,除了在我的情况下,我希望所有的插入都低于8毫秒,图表显示情况显然不是这样.

那么这些高峰来自哪里呢?

当WAL文件达到??给定大小(在我们的例子中为1MB)时,SQLite会生成一个检查点(WAL文件应用于真实数据库文件).因为我们通过PRAGMA SYNCHRONOUS = NORMAL,所以此时,SQLite在硬盘上执行fsync.
我们假设这是这个fsync,使相应的插入真的很慢.
此长插入时间不依赖于WAL文件大小.我们使用链接到WAL文件的编译指示WAL_AUTOCHECKPOINT(默认为1000),我们无法减小峰值的高度.

我们也试过PRAGMA SYNCHRONOUS = OFF.表现更好但仍然不够.
有关信息,我的计算机上的dirty_background_ratio(/ proc / sys / vm / dirty_background_ratio)设置为0,这意味着必须立即在硬盘驱动器上刷新缓存中的所有脏页.

有没有人有想法以及如何“平滑”图表,这意味着所有插入时间都不会超过8毫秒?

解决方法

默认情况下,SQLite中的所有内容都针对吞吐量而非延迟进行了优化.

WAL模式将大多数延迟移动到检查点,但如果您不想要那些大的延迟,则必须使用更频繁的检查点,即在每次交易后执行检查点.
在这种情况下,WAL模式没有意义;更好的尝试journal_mode = persist.
(这没有多大帮助,因为延迟主要来自同步,而不是来自数据量.)

如果WAL /日志操作太慢,并且即使synchronous = off还不够快,那么您唯一的选择是禁用事务安全性并尝试journal_mode = memory或even = off.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读