SQLite 插入大量数据慢的解决方法

SQLite 插入大量数据慢的解决方法,第1张

概述sqlite 插入数据很慢的原因:sqlite在没有显式使用事务的时候会为每条insert都使用事务 *** 作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的 *** 作,时间都耗费在I/O *** 作上,所以很慢。 解决方法是显式使用事务的形式提交:因为我们开始事务后,进行的大量 *** 作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次

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 插入大量数据慢的解决方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1169987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存