- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
提升SQLite数据插入效率低速度慢的方法
提升SQLite数据插入效率低、速度慢的方法
前言
SQLite数据库由于其简单、灵活、轻量、开源,已经被越来越多的被应用到中小型应用中。甚至有人说,SQLite完全可以用来取代c语言中的文件读写操作。因此我最近编写有关遥感数据处理的程序的时候,也将SQLite引入进来,以提高数据的结构化程度,并且提高大数据的处理能力(SQLite最高支持2PB大小的数据)。但是最开始,我发现,直接使用SQL语句的插入效率简直低的令人发指的。后来不断查文档、查资料,才发现了一条快速的“数据插入”之路。本文就以插入数据为例,整合网上和资料书中的各种提高SQLite效率的方法,给出提高SQLite数据插入效率的完整方法。(大神们勿喷)
1 数据
我使用的电脑是Win7 64位系统,使用VC2010编译,SQLIte版本为 ,电脑CPU为二代i3处理器,内存6G。
实验之前,先建立要插入数据的表:
create?table?t1?(id?integer?,?x?integer?,?y?integer,?weight?real)??
2?慢速——最粗暴的方法
SQLite的API中直接执行SQL的函数是:
int?sqlite3_exec(??sqlite3*,????const?char?*sql,???int?(*callback)(void*,int,char**,char**),???void?*,???char?**errmsg)?
直接使用INSERT语句的字符串进行插入,程序部分代码(完整代码见后文),如下:
for(int?i=0;inCount;++i)??
{??
????std::stringstream?ssm;??
????ssminsert?into?t1?values(i,i*2,i/2,i*i);??
????sqlite3_exec(db,ssm.str().c_str(),0,0,0);??
}
这个程序运行的太慢了,我已经没时间等待了,估算了一下,基本上是?7.826?条/s
3?中速——显式开启事务
所谓”事务“就是指一组SQL命令,这些命令要么一起执行,要么都不被执行。在SQLite中,每调用一次sqlite3_exec()函数,就会隐式地开启了一个事务,如果插入一条数据,就调用该函数一次,事务就会被反复地开启、关闭,会增大IO量。如果在插入数据前显式开启事务,插入后再一起提交,则会大大提高IO效率,进而加数据快插入速度。
开启事务只需在上述代码的前后各加一句开启与提交事务的命令即可:
sqlite3_exec(db,begin;,0,0,0);??
for(int?i=0;inCount;++i)??
{??
????std::stringstream?ssm;??
????ssminsert?into?t1?values(i,i*2,i/2,i*i);??
????sqlite3_exec(db,ssm.str().c_str(),0,0,0);??
}??
sqlite3_exec(db,commit;,0,0,0);??
显式开启事务后,这个程序运行起来明显快很多,估算效率达到了34095条/s,较原始方法提升约5000倍。
4?高速——写同步(synchronous)
我要使用一个遥感处理算法处理10000*10000的影像,中间有一步需要插入100000000条数据到数据库中,如果按照开启事务后的速度34095条/s,则需要100000000÷34095 =?2932秒 = 48.9分,仍然不能够接受,所以我接着找提升速度的方法。终于,在有关讲解SQLite配置的资料中,看到了“写同步”选项。
在SQLite中,数据库配置的参数都由编译指示(pragma)来实现的,而其中synchronous选项有三种可选状态,分别是full、normal、off。 HYPERLINK /victoryknight/article/details/7461703 \t /home/zhangjf/文档\\x/_blank 这篇博客以及 HYPERLINK /pragma.html \l pragma_synchronous \t /home/zhangjf/文档\\x/_blank 官方文档里面有详细讲到这三种参数的设置。简要说来,full写入速度最慢,但保证数据是安全的,不受断电、系统崩溃等影响,而off可以加速数据库的一些操作,但如果系统崩溃或断电,则数据库可能会损毁。
SQLite3中,该选项的默认值就是full,如果我们再插入数据前将其改为off,则会提高效率。如果仅仅将SQLite当做一种临时数据库的话,完全没必要设置为full。在代码中,设置方法就是在打开数据库之后,直
文档评论(0)