简而言之,这篇文章想回答以下问题:我们如何(如果可能)配置 SQLite 数据库以绝对确保任何 INSERT 命令将在不到 8 毫秒内返回?
我所说的配置是指:编译选项、数据库编译指示选项和运行时选项。
为了提供一些背景知识,我们想以 120 fps 应用相同的 INSERT 语句。 (1000 毫秒/120 帧/秒≃ 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, ?, ?, ?, ?)
最后一个? (for fileName) 是一个文件的名称,所以它是一个小字符串。因此每个 INSERT 都很小。
当然,我使用预编译语句来加速这个过程。
我有一个小程序,每 8 毫秒插入一次,并测量执行此插入所花费的时间。更准确地说,程序进行了一次插入,然后等待 8 毫秒,然后进行了另一次插入,依此类推……最后,推送了 7200 次插入,因此程序运行了大约 1 分钟。
这是显示两个图表的两个链接:
此图显示了插入所花费的毫秒数与以分钟表示的时间的函数关系。如您所见,大多数情况下,插入时间为 0,但也有超过 100 毫秒的尖峰。
此图像是同一数据的直方图表示。所有低于 5 毫秒的值都没有表示,但我可以告诉你,从 7200 个插入中,7161 个低于 5 毫秒(并且会在 0 处给出一个巨大的峰值,这会使图表的可读性降低)。
程序总时间为 实际 1m2.286s 用户 0m1.228s 系统 0m0.320s。
假设是 1 分 4 秒。不要忘记我们花了 7200 次 8 毫秒等待。所以 7200 次插入需要 4 秒 ---> 我们有每秒 1800 次插入的速率,因此每次插入的平均时间为 0.55 毫秒。 这真的很棒,除了在我的例子中,我希望所有插入的时间都低于 8 毫秒,而图表显示这显然不是这种情况。
那么这些峰从何而来?
当 WAL 文件达到给定大小(在我们的例子中为 1MB)时,SQLite 会创建一个检查点(WAL 文件应用于真实的数据库文件)。而因为我们通过了PRAGMA SYNCHRONOUS=NORMAL,那么此时,SQLite会对硬盘进行一次fsync。 我们假设正是这个 fsync 使得相应的插入非常慢。 这个长插入时间不依赖于 WAL 文件大小。我们使用了链接到 WAL 文件的 pragma WAL_AUTOCHECKPOINT(默认为 1000),但我们无法降低峰的高度。
我们还尝试了 PRAGMA SYNCHRONOUS=OFF。表演更好,但仍然不够。 有关信息,我计算机上的 dirty_background_ratio (/proc/sys/vm/dirty_background_ratio) 设置为 0,这意味着缓存中的所有脏页必须立即刷新到硬盘上。
有没有人知道如何“平滑”图表,这意味着所有插入时间都不会超过 8 毫秒?
最佳答案
默认情况下,SQLite 中的几乎所有内容都针对吞吐量而非延迟进行了优化。
WAL 模式将大部分延迟移至检查点,但如果您不希望出现这些大延迟,则必须使用更频繁的检查点,即在每个事务后执行检查点。
在那种情况下,WAL 模式没有意义;最好试试 journal_mode=persist。
(这不会有太大帮助,因为延迟主要来自同步,而不是数据量。)
如果 WAL/journal 操作太慢,甚至连 synchronous=off 都不够快,那么你唯一的选择就是禁用事务安全并尝试 journal_mode=memory 甚至 =off。
关于c++ - 为实时操作配置 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22812970/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?