sqlite内存模式_传智院的博客-CSDN博客_sqlite 内存模式


本站和网页 https://blog.csdn.net/MEIYOUDAO_JIUSHIDAO/article/details/117325044 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

sqlite内存模式_传智院的博客-CSDN博客_sqlite 内存模式
sqlite内存模式
传智院
于 2021-05-27 11:36:02 发布
2830
收藏
分类专栏:
sqlite
文章标签:
sqlite
原文链接:https://www.cnblogs.com/bbqzsl/p/6066851.html
版权
sqlite
专栏收录该内容
5 篇文章
1 订阅
订阅专栏
SQLite性能 - inmemory模式。
SQLite创建的数据库有一种模式IN-MEMORY,但是它并不表示SQLite就成了一个内存数据库。IN-MEMORY模式可以简单地理解为,(2020 表述勘误:本来创建的数据库文件是基于磁盘的,现在整个文件使用内存空间来代替磁盘空间,没有了文件作为backingstore,不必在修改数据库后将缓存页提交到文件系统),其它操作保持一致。也就是数据库的设计没有根本改变。
inmemory与tempdb是两种节约模式,节约的对象为(rollback)日志文件以及数据库文件,减少IO。inmemory将日志写在内存,并且去除数据库文件作为backingStore,缓存页不用提交到文件系统。tempdb只会在只会在脏的缓存页超过当前总量的25%才会同步刷写到文件,换句话说在临时数据库模式下,事务提交时并不总同步脏页,因此减少了IO数量,事务日志也受这种机制影响,所以在临时数据库模式下,事务日志是不是MEMORY并不重要。回过头来看,内存模式则是临时模式的一种极致,杜绝所有的IO。这两种模式都只能存在一个sqlite3连接,关闭时销毁。
提到内存,许多人就会简单地理解为,内存比磁盘速度快很多,所以内存模式比磁盘模式的数据库速度也快很多,甚至有人望文生意就把它变成等同于内存数据库。
它并不是为内存数据库应用而设计的,本质还是文件数据库。它的数据库存储文件有将近一半的空间是空置的,这是它的B树存储决定的,(2020 勘误:对于固定长度记录,页面使用率最大化,对于非自增计数键的索引,页面一般会保留20~60%的空间,方便插入)请参看上一篇SQLite存储格式。内存模式只是将数据库存储文件放入内存空间,但并不考虑最有效管理你的内存空间,其它临时文件也要使用内存,事务回滚日志一样要生成,只是使用了内存空间。它的作用应该偏向于临时性的用途。
(2020 补充:下面的测试有局限性,)
我们先来看一下下面的测试结果,分别往memory和disk模式的sqlite数据库进行1w, 10w以及100w条数据的插入,采用一次性提交事务。另外使用commit_hook捕捉事务提交次数。
(注:测试场景为在新建的数据库做插入操作,所以回滚日志是很小的,并且无需要在插入过程中查找而从数据库加载页面,因此测试也并不全面)
内存模式
磁盘模式
在事务提交前的耗时 (事务提交后的总耗时):
 1w10w100w内存模式0.04s0.35s3.60s磁盘模式0.06s (0.27s)0.47s (0.72s)3.95s (4.62s)
可以看到当操作的数据越少时,内存模式的性能提高得越明显,事务IO的同步时间消耗越显注。
上图还有一组数据比较,就是在单次事务提交中,如果要为每条插入语句准备的话
 1w10w100w内存模式0.19s1.92s19.46s磁盘模式0.21s (0.35s)2.06s (2.26s)19.88s (20.41s)
我们从SQLite的设计来分析,一次插入操作,SQLite到底做了些什么。首先SQLite的数据库操作是以页面大小为单位的。在单条记录插入的事务中,回滚日志文件被创建。在B树中查找目标页面,要读入一些页面,然后将目标页面以及要修改的父级页面写出到回滚日志。操作目标页面的内存映像,插入一条记录,并在页面内重排序(索引排序,无索引做自增计数排序,参看上一篇《SQLite数据库存储格式》)。最后事务提交将修改的页面写出到数据库文件,成功后再删除日志文件。在这过程中显式进行了2次写磁盘(1次写日志文件,1次同步写数据库),还有2次隐式写磁盘(日志文件的创建和删除),这是在操作目录节点。以及为查找加载的页面读操作。更加详细可以参看官方文档的讨论章节《Atomic Commit In SQLite》。
如果假设插入100条记录,每条记录都要提交一次事务就很不划算,所以需要批量操作来减少事务提交次数。假设页面大小为4KB,记录长度在20字节内,每页可放多于200条记录,一次事务提交插入100条记录,假设这100条记录正好能放入到同一页面又没有产生页面分裂,这样就可以在单条记录插入事务的IO开销耗损代价中完成100条记录插入。
当我们的事务中,插入的数据越多,事务的IO代价就会摊得越薄,所以在插入100w条记录的测试结果中,内存模式和磁盘模式的耗时都十分接近。实际应用场合中也很少会需要一次插入100w的数据。有这样的需要就不要考虑SQLite。
(补充说明一下,事务IO指代同步数据库的IO,以及回滚日志的IO,只在本文使用)
除了IO外,还有没有其它地方也影响着性能。那就是语句执行。其实反观一切,都是在对循环进行优化。
for (i = 0; i < repeat; ++i)
exec("BEGIN TRANS");
exec("INSERT INTO ...");
exec("END TRANS");
批量插入:
exec("BEGIN TRANS");
for (i = 0; i < repeat; ++i)
exec("INSERT INTO ...");
exec("END TRANS");
当我们展开插入语句的执行
exec("BEGIN TRANS");
for (i = 0; i < repeat; ++i)
// unwind exec("INSERT INTO ...");
prepare("INSERT INTO ...");
bind();
step();
finalize();
exec("END TRANS");
又发现循环内可以移出部分语句
exec("BEGIN TRANS");
// unwind exec("INSERT INTO ...");
prepare("INSERT INTO ...");
for (i = 0; i < repeat; ++i)
bind();
step();
finalize();
exec("END TRANS");
这样就得到了批量插入的最终优化模式。
所以对sql语句的分析,编译和释放是直接在损耗CPU,而同步IO则是在饥饿CPU。
请看下图
分别为内存模式1w和10w两组测试,每组测试包括4项测试
1.只编译一条语句,只提交一次事务
2.每次插入编译语句,只提交一次事务
3.只编译一条语句,但使用自动事务。
4.每次插入编译语句,并使用自动事务。
可以看到测试项目4基本上就是测试项目2和测试项目3的结果的和。
测试项目1就是批量插入优化的最终结果。
下面是探讨内存模式的使用:
经过上面的分析,内存模式在批量插入对比磁盘模式提升不是太显注的,请现在开始关注未批量插入的结果。
下面给出的是磁盘模式0.1w和0.2w两组测试,每组测试包括4项测试
可以看到在非批量插入情况,sqlite表现很差要100秒来完成1000次单条插入事务,但绝非sqlite很吃力,因为cpu在空载,IO阻塞了程序。
再来看内存模式20w测试
可以看到sqlite在内存模式,即使在20w次的单条插入事务,其耗时也不太逊于磁盘模式100w插入一次事务。
 0.1w0.2w20w内存模式(非批量插入)  15.87s磁盘模式(非批量插入)97.4s198.28s 
 编译1次插入语句每次插入编译1次语句内存模式(20w,20w次事务)11.10s15.87s磁盘模式(100w,1次事务)4.62s20.41s
不能给出内存模式100w次事务的测试结果是因为程序运行出问题。
在100w的插入一次性事务测试结果,内存模式和磁盘模式相差不到1秒,这1秒就是最后大量数据库同步到数据库的IO时间。
再回到上面两图两表的测试结果,磁盘模式在执行多事务显得偏瘫,每秒不多于10个单条插入的事务。而内存模式下执行事务的能力仍然坚挺,每秒1w次单条插入的事务也不在话下。
在实际应用中,数据随机实时,你又不想做批量插入控制,就可以考虑用内存模式将现有的数据马上用事务提交,不管事务提交的数据是多是少。你只要定制计划,将内存模式的数据库同步到你的外部数据库。因为每个内存模式的数据库是独立的,你同步一个内存模式的数据库到外部的期间,就可以同时使用另一个内存模式的数据库缓冲数据。
(上面删除段落是根据MinGW系统的测试结果。在真机环境测试了win 7 32bit和win 7 64bit,以及在它们之上使用mingw系统,测试结果是sqlite处理1000个单条插入事务总耗时在100秒级别。而在vm环境,vm虚拟磁盘上测试了xp,linux和macosx,测试结果是sqlite处理1000个单条插入事务总耗时在10秒级别内。值得注意的是,vm虚拟磁盘不是直接操作磁盘,所以我还要另找磁盘,挂接真实的磁盘对虚拟机环境进行测试。)
更多磁盘模式的测试结果在下一篇《意想不到,但又情理之中的测试结果》。 在经过慎重考虑后,在linux和mac环境下进行了测试,验证了一句“数据库都构建在痛苦的操作系统之上”。上面的测试环境是MinGw,痛苦的不是windows而是在windows之上加上的一层MinGw系统,磁盘操作十分痛苦。根据在linux和mac环境的测试结果,内存模式和磁盘模式在单条插入自动事务的性能更加接近,相差只有10倍左右,由于不用在MinGW这样的适配系统痛苦地操作磁盘,所以在其它批量插入事务的测试项目中,两种模式的测试结果更加趋于接近。
至于你想用sqlite的内存模式作持久用途或者去媲美内存数据库,可能不是正确的选择。sqlite是一个体积轻巧,可以帮你管理关系型数据的嵌入式数据库。它适应嵌入式的空间小,耗电低和占用内存有限的特殊环境。它的高效是不因为它的简单,而在基本的数据库查询功能上有打折扣。它在设计上有针对性的取舍,使它更适合某些应用场合,也必然在舍的部分蹩足。
本篇至此结束,谢谢观看。
后续会有":memory:","file:whereIsDb?mode=memory"以及"disk.db"这三种模式的对比。
测试代码在https://github.com/bbqz007/xw/test.sqlite.in-memory.zip。(不支持VC,需要自行下载编译sqlite。支持VC编译的测试代码未上传。)
mingw测试插入1000条数据使用自动事务,即一共提交1000次事务:
运行在      总耗时
xp (vm11)            9s
win 7 64bit        200s
win 7 32bit        100s
最后补上Linux (vm11)和MacOSX (vm11)的测试结果:
 Linux测试结果
MacOSX的测试结果:
逆向深入objc,c++ windows下仿objc动画层UI引擎
传智院
关注
关注
点赞
收藏
评论
sqlite内存模式
SQLite性能 - inmemory模式。SQLite创建的数据库有一种模式IN-MEMORY,但是它并不表示SQLite就成了一个内存数据库。IN-MEMORY模式可以简单地理解为,(2020 表述勘误:本来创建的数据库文件是基于磁盘的,现在整个文件使用内存空间来代替磁盘空间,没有了文件作为backingstore,不必在修改数据库后将缓存页提交到文件系统),其它操作保持一致。也就是数据库的设计没有根本改变。inmemory与tempdb是两种节约模式,节约的对象为(rollback)日志文件以
复制链接
扫一扫
专栏目录
SQLite教程(十):内存数据库和临时数据库
12-15
一、内存数据库:
在SQLite中,数据库通常是存储在磁盘文件中的。然而在有些情况下,我们可以让数据库始终驻留在内存中。最常用的一种方式是在调用sqlite3_open()的时候,数据库文件名参数传递”:memory:”,如:
代码如下:
rc = sqlite3_open(“:memory:”, &db);
在调用完以上函数后,不会有任何磁盘文件被生成,取而代之的是,一个新的数据库在纯内存中被成功创建了。由于没有持久化,该数据库在当前数据库连接被关闭后就会立刻消失。需要注意的是,尽管多个数据库连接都可以通过上面的方法创建内存数据库,然而它们却是不同的数据库,相
快速入门sqlite内存数据库,用sqlite构建一日志工具
03-17
NULL
博文链接:https://raojl.iteye.com/blog/556364
评论 1
您还未登录,请先
登录
后发表或查看评论
sqlite3 内存持续增加_sqlite3使用简介(内含解决sqlite内存的方法)
weixin_39992788的博客
12-24
175
一.使用流程要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完成配置可以使用sqlite了。使用的过程根据使用的函数大致分为如下几个过程:sqlite3_open()sqlite3_prepare()sqlite3_step()sqlite...
SQLite 文件使用 Memory 模式
weixin_34161083的博客
10-27
6669
2019独角兽企业重金招聘Python工程师标准>>>
...
Sqlite3写性能优化-每秒百万条写入
Ango_的专栏
12-21
7110
sqlite3写入速度很慢?那一定是没有找到合适的方法,本文测试了几种方法并提供了测试源代码
【解决方案】SQLite操作优化:从内存中读取,写入内存和本地
赵庆明老师
11-07
9208
SQLite是我非常喜欢的一个小型数据库。如果你真把它当SQL Server、Oracle来使用的话,那简直是灾难,读写效率带来的死锁问题够你受的。
不过,如果把整个数据库加载到内存中呢?哈哈,那简直是爽翻了。不过,写入怎么解决呢?
你的程序不知道什么时候会退出,一旦退出,数据还未保存的话,哭吧。。。。
其实,向数据库中写入数据的频率是非常低的,而读取数据的频率却很高。
且看我的更新方法:
1、把...
SQLite:内存数据库
WIP56的博客
04-28
4349
一、内存数据库:
在SQLite中,数据库通常是存储在磁盘文件中的。然而在有些情况下,我们可以让数据库始终驻留在内存中。最常用的一种方式是在调用sqlite3_open()的时候,数据库文件名参数传递”:memory:”,如:
代码如下:
rc = sqlite3_open(“:memory:”, &db);
在调用完以上函数后,不会有任何磁盘文件被生成,取而代之的是,一个新的数据库在纯内存中被成功创建了。由于没有持久化,该数据库在当前数据库连接被关闭后就会立刻消失。需要注意的是,尽管多个数据库连接
SQLite3 极简教程 & Go 使用 SQLite 内存模式操作数据结构
禅与计算机程序设计艺术
05-08
1983
SQLite 简介
关键词: RDBMS (embedded), C
SQLite is a database engine written in the C language. It is not a standalone app; rather, it is a library that software developers embed in their apps.
...
sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样?
$firecat利白的代码足迹$
09-26
8417
本文是转载自:http://fairysoftware.com/sqlite_shu_ju_ku.html
sqlite是款不错的数据库,使用方便,不需要事先安装软件,事先建表。很多人担心它的性能和数据存储量问题。
比如有的网友问:Sqlite数据库最大可以多大呀?会不会像acc数据库那样,几十MB就暴掉了?
不会的,放心用SQLite, 这是两个数量级的东西, 看下面的说明。
Access不能算真正意义上的数据库,但是Access是前台和后台在一起,对小用户还是有其优点。
SQLite,是一款轻型的数据
SQLite内存数据库使用场景
最新发布
weixin_38940097的博客
12-09
47
SQLite 文件数据库和内存数据库同时使用场景
sqlite内存数据库、文件数据库
chenliang0224的专栏
07-16
1471
详见:https://blog.csdn.net/lijinqi1987/article/details/51672711
由于sqlite对多进程操作支持效果不太理想,在项目中,为了避免频繁读写 文件数据库带来的性能损耗,我们可以采用操作sqlite内存数据库,并将内存数据库定时同步到文件数据库中的方法。
实现思路如下:
1、创建文件数据库;
2、创建内存数据库(文件数据...
sqlite3 内存占用不断增加的问题
努力搬砖ing...
03-17
3222
文章目录1 背景2 问题3 排查4 问题原因5 解决方法
1 背景
嵌入式项目,故选用轻量级数据库 sqlite3;
通过 sqlite3 存储日志,日志数量较多,数据库文件大于500M;
嵌入式系统内存400M左右。
2 问题
在集成过程中出现如下问题:
通过 sqlite3_exec 函数不断往数据库中插入日志,内存占用不断增加;
通过 select count(*) from table_name获取日志的条数,内存迅速增大,增加的内存约等于数据库文件的大小。
开始一直以为是内存泄露了,不断排
SQLite之C++封装库CppSQLite使用方法
积累点滴,保持自我
12-04
3277
SQLite是一个超轻量级的开源数据库,从官网上下载的source是一个用c写的文件,在C++(VC)中调用时难免会碰到一些问题,这时就可使用CppSQLite。CppSQLite(最近版本为CppSQLite3)是对SQLite进行二次封装后的C++类库。
SQLite官网:http://www.sqlite.org/
cppsqlite下载地址:https://github.com/lmmir/CppSQLite3
一、使用前需要包含sqlite3头文件和库文件。
(1)CppSQLit..
【Sqlite3】内存调试
林多
02-27
748
Sqlite3内存调式
基本上来说Sliqte3提供的接口,只要正确操作,是不会发生内存泄漏的问题。它有一套严格的内存理论,以及实现机制。这里主要讨论,如何进行内存方面的调式、确认。
Sqlite3动态内存
查看sqllite3当前持有的动态内存大小(byte)。该接口通过获取SQLITE_STATUS_MEMORY_USED状态值实现。大概原理为,sqlite3在申请或释放动态内存时,会将SQLITE_STATUS_MEMORY_USED对应的状态值做加或减去分配的bytpe的操作。
// 接口
转 -- 内存数据库性能评测之SQLite数据库
edwzhang的专栏
10-17
1158
原址如下:
http://tech.it168.com/a2012/1016/1408/000001408814_all.shtml
内存数据库性能评测之SQLite数据库
【IT168 专稿】SQLite是一款轻型的数据库,它占用资源非常的低,同时能够跟很多程序语言相结合,但是支持的SQL语句不会逊色于其他开源数据库。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资
SQLite安装部署、增、删、改、查与memory模式的性能测试
weixin_40668374的博客
11-26
3382
SQLite安装部署、增、删、改、查与memory模式的性能测试
一、SQLite安装
1. 下载sqlite的安装包
链接:https://pan.baidu.com/s/1KBiOUTBx8sAY165RIFB5BQ
提取码:7qt6
2. 编译安装
mkdir -p /opt/soft
#把安装下载到/opt/soft
tar zxvf /opt/soft/sqlite-autoconf-3330000.tar.gz -C /opt/soft/
mv /opt/soft/sqlite-autoc
SQLite3性能优化
热门推荐
tietao的专栏
10-20
2万+
SQLite3性能调整主要通过pragma指令来实现。
比如调整:空间释放、磁盘同步、Cache大小等。
一.空间释放
1.如何查询:
PRAGMA auto_vacuum;
含义:查询数据库的auto-vacuum标记。
2.标记含义:
auto-vacuum标记的含义:
正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操
IDEA中使用SQLite数据库
xdg15294969271的博客
12-23
3706
文章目录1、准备工作2、搭建SQLite2.1 配置DataSources2.2 配置Driver2.3 测试连接是否成功2.4 建表插入查询3 测试是否搭建成功4 在main函数中调用数据库4.1 查询代码4.2 查询结果
1、准备工作
下载JDBC驱动
后面要使用
2、搭建SQLite
新建一个JAVA项目,长这样。
双击“shift”出现搜索框,在搜索狂里面输入“Database”,右边会出现一个这个
新建一个SQLite
会出现以下界面,剩下的步骤就是在这里配置我们的sqlite啦
2.1 配
SQLite内存数据库使用有感
mynicedream的专栏
04-12
1万+
SQLite不仅可以把数据库 放在硬盘上,还可以放在内存中(sqlite3_open(":memory:", &db)),经测试,同样条件下数据库放在内存中比放在硬盘上插入记录速度快差不多3倍。但数据库放在内存中时有如下缺陷:1、断电或程序崩溃后数据库就会消失,你需要定期Attach到硬盘上备份;2、在内存中的数据库不能被别的进程访问(因为没名字,以后可能支持),即使在多线程下,也得使
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
传智院
CSDN认证博客专家
CSDN认证企业博客
码龄10年
暂无认证
279
原创
2万+
周排名
4559
总排名
57万+
访问
等级
8045
积分
153
粉丝
209
获赞
139
评论
739
收藏
私信
关注
热门文章
ClickHouse 聚合函数
16475
docker-compose command多条指令,while
11586
go换行(行太长)
11047
cron定时任务详解
10734
vi /etc/sysconfig/network
7412
分类专栏
面试算法与数据结构
付费
41篇
内存分析
付费
8篇
openssl源码分析(1.1.1+)
付费
16篇
设计模式详解
付费
24篇
设备驱动
付费
12篇
c++
15篇
sqlite
5篇
elasticsearch
14篇
clickhouse
4篇
web
10篇
go
11篇
libevent源码分析
5篇
message middleware
12篇
ops
9篇
nginx
7篇
machine_learning
1篇
k8s-docker-suporvisor
14篇
lua
5篇
python
26篇
linux
56篇
c/c++/boost
33篇
VC++
18篇
xml/json/yaml
9篇
error
11篇
network
36篇
multi_thread
5篇
audio/vedio
20篇
compiler
7篇
hardware
1篇
database/disk
24篇
project manage
4篇
tools
51篇
security
33篇
interveiw
6篇
life
6篇
script_language
4篇
distributed system
11篇
framework
11篇
big data
9篇
java
2篇
IOT
3篇
php
2篇
最新评论
Couldn't create temporary file /tmp/apt.conf.g1YDx9
十二壳:
太厉害了!找了这么久终于解决了!!
Couldn't create temporary file /tmp/apt.conf.g1YDx9
十二壳:
太厉害了!找了这么久终于解决了!!
string 析构崩溃 assign
LIUZHAOPEI_CSDN:
请问崩溃问题是怎样解决的?
c++ http server
头槌骚年:
Drogon 现在Star:8K
string 析构崩溃 assign
传智院:
把你的崩溃栈发出来看下
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
wazuh-monitord agent连接监控
@lru_cache 内置 LRU 缓存
wazuh api分析
2022
10月
6篇
09月
2篇
08月
7篇
07月
4篇
05月
1篇
04月
7篇
03月
8篇
02月
2篇
01月
3篇
2021年113篇
2020年105篇
2019年100篇
2018年11篇
2017年46篇
2016年9篇
2015年35篇
2014年19篇
2013年121篇
目录
目录
分类专栏
面试算法与数据结构
付费
41篇
内存分析
付费
8篇
openssl源码分析(1.1.1+)
付费
16篇
设计模式详解
付费
24篇
设备驱动
付费
12篇
c++
15篇
sqlite
5篇
elasticsearch
14篇
clickhouse
4篇
web
10篇
go
11篇
libevent源码分析
5篇
message middleware
12篇
ops
9篇
nginx
7篇
machine_learning
1篇
k8s-docker-suporvisor
14篇
lua
5篇
python
26篇
linux
56篇
c/c++/boost
33篇
VC++
18篇
xml/json/yaml
9篇
error
11篇
network
36篇
multi_thread
5篇
audio/vedio
20篇
compiler
7篇
hardware
1篇
database/disk
24篇
project manage
4篇
tools
51篇
security
33篇
interveiw
6篇
life
6篇
script_language
4篇
distributed system
11篇
framework
11篇
big data
9篇
java
2篇
IOT
3篇
php
2篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值