sqlite 插入数据很慢的原因:sqlite在没有显式使用事务的时候会为每条insert都使用事务 *** 作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的 *** 作,时间都耗费在I/O *** 作上,所以很慢。
解决方法是显式使用事务的形式提交:因为我们开始事务后,进行的大量 *** 作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次。
我在没有显式使用事务形式插入100条数据时用了12.226s;用显式事务形式,插入100条只用了0.172s,插入1000000条也才34.891s,相关很大吧。
显式使用事务的例子:
#include <iostream>#include <windows.h>using namespace std;#include "sqlite/sqlite3.h"int main(){ sqlite3* db; int nResult = sqlite3_open(test.db",&db); if (nResult != sqlITE_OK) { cout<<打开数据库失败:"<<sqlite3_errmsg(db)<<endl; return 0; } else { cout<<数据库打开成功"<<endl; } char* errmsg; nResult = sqlite3_exec(db,create table fuck(ID integer primary key autoincrement,name varchar(100))errmsg); if (nResult != sqlITE_OK) { sqlite3_close(db); cout<<errmsg; sqlite3_free(errmsg); 0; } string strsql; strsql+=begin;\n"; for (int i=0;i<100;i++) { strsql+=insert into fuck values(null,'heh');\n"; } strsql+=commit;//cout<<strsql<<endl; SYstemTIME tm_s; GetLocalTime(&tm_s); nResult = sqlite3_exec(db,strsql.c_str(),&errmsg); SYstemTIME tm_e; GetLocalTime(&tm_e); if (nResult != sqlITE_OK) { sqlite3_close(db); cout<<errmsg<<endl; sqlite3_free(errmsg); 0; } cout<<start:"<<tm_s.wMinute<<:"<<tm_s.wSecond<<"<<tm_s.wMilliseconds<<endl; cout<<end :"<<tm_e.wMinute<<"<<tm_e.wSecond<<"<<tm_e.wMilliseconds<<endl; 0;}总结
以上是内存溢出为你收集整理的SQLite 插入大量数据慢的解决方法全部内容,希望文章能够帮你解决SQLite 插入大量数据慢的解决方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)