MFC使用SQLite 学习系列 二:无法容忍的数据插入效率
上一篇随笔中,介绍了,基本的使用没什么问题了,那么开始数据的插入。
一 问题--无法容忍的插入效率
代码写入基本完成,然后开始测试。起初,插入数据的时候基本上是插入每次插入9组数据,看不出来数据插入的速度。
然后,当我每次插入600组数据的时候,我的天,这个速度真的无法容忍啊。
插入数据的方式是使用for循环,每次插入一组数据。
for (int i = ; i < DataArray.GetCount(); i ++)
{
progressDlg->ProGress.SetPos(i);
szQuery.Format("INSERT INTO %s VALUES ('%d','%0.2f','%0.5f','%0.5f','%0.1f','%0.5f','%0.5f','%0.2f','%0.2f','%0.2f')",strTemp,i+,DataArray.GetAt(i).L,DataArray.GetAt(i).x,DataArray.GetAt(i).y,DataArray.GetAt(i).Tc,DataArray.GetAt(i).u,DataArray.GetAt(i).v,DataArray.GetAt(i).X,DataArray.GetAt(i).Y,DataArray.GetAt(i).Z);
fTest = sqlite.DirectStatement(szQuery);
if (!fTest)
AfxMessageBox(_T("插入数据失败!"));
}
我的天,大概感受了一下,600组数据,最起码一分钟以上,而我原来使用文本记录的时候,开始数据少的时候,也不过一秒钟100组数据,可换成这SQLite,600组数据居然要一分多钟。
增加个时间来计下时间:
SYSTEMTIME timeStart;
SYSTEMTIME timeStop;
GetLocalTime(&timeStart);
for (int i = ; i < DataArray.GetCount(); i ++)
{
progressDlg->ProGress.SetPos(i);
szQuery.Format("INSERT INTO %s VALUES ('%d','%0.2f','%0.5f','%0.5f','%0.1f','%0.5f','%0.5f','%0.2f','%0.2f','%0.2f')",strTemp,i+,DataArray.GetAt(i).L,DataArray.GetAt(i).x,DataArray.GetAt(i).y,DataArray.GetAt(i).Tc,DataArray.GetAt(i).u,DataArray.GetAt(i).v,DataArray.GetAt(i).X,DataArray.GetAt(i).Y,DataArray.GetAt(i).Z);
fTest = sqlite.DirectStatement(szQuery);
if (!fTest)
AfxMessageBox(_T("插入数据失败!"));
}
GetLocalTime(&timeStop);
printf("\n开始时间 %d:%d:%d",timeStart.wMinute,timeStart.wSecond,timeStart.wMilliseconds);
printf("\n结束时间 %d:%d:%d",timeStop.wMinute,timeStop.wSecond,timeStop.wMilliseconds);
printf("\n用时%d毫秒\n\n",(timeStop.wMinute** + timeStop.wSecond* + timeStop.wMilliseconds)-(timeStart.wMinute** + timeStart.wSecond* + timeStart.wMilliseconds));
经过准确的计时,得到600组数据插入的时间是63024毫秒,我的天,再逗我吗。

二 解决方案 事务
经过查找资料,了解到,提升插入效率的方法,就是不要一条条的插入数据,启用一个事务,一起插入。
sqlite3_exec(db,"begin;",,,);
for(int i=;i<nCount;++i)
{
std::stringstream ssm;
ssm<<"insert into t1 values("<<i<<","<<i*<<","<<i/<<","<<i*i<<")";
sqlite3_exec(db,ssm.str().c_str(),,,);
}
sqlite3_exec(db,"commit;",,,);
那么使用SQLite3Wrapper的封装类该怎么办呢。
只需要插入前后增加一个Begin() 和 Commit()即可,就是这个样子:
sqlite.Commit();
GetLocalTime(&timeStop);
printf("\n开始时间 %d:%d:%d",timeStart.wMinute,timeStart.wSecond,timeStart.wMilliseconds);
printf("\n结束时间 %d:%d:%d",timeStop.wMinute,timeStop.wSecond,timeStop.wMilliseconds);
printf("\n用时%d毫秒\n\n",(timeStop.wMinute** + timeStop.wSecond* + timeStop.wMilliseconds)-(timeStart.wMinute** + timeStart.wSecond* + timeStart.wMilliseconds));
progressDlg->OnClose(); SYSTEMTIME timeStart;
SYSTEMTIME timeStop;
GetLocalTime(&timeStart);
sqlite.Begin();
for (int i = ; i < DataArray.GetCount(); i ++)
{
progressDlg->ProGress.SetPos(i);
szQuery.Format("INSERT INTO %s VALUES ('%d','%0.2f','%0.5f','%0.5f','%0.1f','%0.5f','%0.5f','%0.2f','%0.2f','%0.2f')",strTemp,i+,DataArray.GetAt(i).L,DataArray.GetAt(i).x,DataArray.GetAt(i).y,DataArray.GetAt(i).Tc,DataArray.GetAt(i).u,DataArray.GetAt(i).v,DataArray.GetAt(i).X,DataArray.GetAt(i).Y,DataArray.GetAt(i).Z);
fTest = sqlite.DirectStatement(szQuery);
if (!fTest)
AfxMessageBox(_T("插入数据失败!"));
}
sqlite.Commit();
GetLocalTime(&timeStop);
printf("\n开始时间 %d:%d:%d",timeStart.wMinute,timeStart.wSecond,timeStart.wMilliseconds);
printf("\n结束时间 %d:%d:%d",timeStop.wMinute,timeStop.wSecond,timeStop.wMilliseconds);
printf("\n用时%d毫秒\n\n",(timeStop.wMinute** + timeStop.wSecond* + timeStop.wMilliseconds)-(timeStart.wMinute** + timeStart.wSecond* + timeStart.wMilliseconds));
经过计时输出,600组数据输出的时间大概是329毫秒,这提升那不是一个等级的啊。当然,这个速度对我目前的数据来说,已经够用了。

MFC使用SQLite 学习系列 二:无法容忍的数据插入效率的更多相关文章
- MFC使用SQLite 学习系列 一: SQLITE_MISUSE错误
一 为什么要选择SQLite 由于使用文本文件来记录测试数据,速度越来越慢的问题,经过园友推荐,使用了SQLite来进行数据的存储,再次感谢园友@LightSmaile. 关于这个问题,可以参考一下上 ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- Maven学习系列二(1-5)
Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- DocX开源WORD操作组件的学习系列二
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
- RabbitMQ学习系列二-C#代码发送消息
RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...
- .net reactor 学习系列(二)---.net reactor界面各功能说明
原文:.net reactor 学习系列(二)---.net reactor界面各功能说明 安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...
- 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...
随机推荐
- 08_jquery基础应用第一天
视频来源:麦子学院 讲师:李景山
- sed进阶N;P;D
案例 sed 的高级替换 $cat file1 why:1 why:2 3 4 5 why:6 why:7 8 why:9 $cat file2 why:1 why:2 3 4 5 why:6 why ...
- zabbix-proxy搭建
环境: 因为公司需要监控远程客户机,但server端无法主动连接agent端,客户端可以连接公司ip 公司有固定ip,可以开放某个端口给zabbixserver,客户机agent端可以主动通过外网连接 ...
- Struts2实现文件下载
实现文件下载: 1.导包:commons-fileload-xx.jar commons-io-xx.jar 2.jsp页面: <s:iterator value="#session. ...
- Node-debug方法
本文使用配置node-inspector配合chorme完成debug(编辑器使用SublimeText3). 1.用命令行进入安装node的目录,使用npm install -g node-insp ...
- Java多线程优化方法及使用方式
一.多线程介绍 在编程中,我们不可逃避的会遇到多线程的编程问题,因为在大多数的业务系统中需要并发处理,如果是在并发的场景中,多线程就非常重要了.另外,我们在面试的时候,面试官通常也会问到我们关于多线程 ...
- 【Thinkphp 5】 如何引入extend拓展文件
extend/maile/cc.php 文件目录 cc文件 必须要加上命名空间,如下 cc.php文件内容如下: namespace maile; //命名空间 maile是文件夹名称 class C ...
- 深度优化LNMP之MySQL
MySQL数据库优化框架体系 1.硬件层面优化 2.操作系统层面优化 3.MySQL数据库层面优化 4.MySQL安全优化 5.网站集群架构上的优化 6.MySQL流程.制度控制优化 1 硬件层面优化 ...
- 填坑:在 SegmentFault 开发单页应用之图片引用的问题探索
前言 前段时间,SegmentFault 低调上线了 技术号 模块,方便用户对数据进行集中管理.在开发过程中,第一次引入了 MV* 框架. SF 的基本架构还是后端路由,这也使得页面频繁地整体请求,体 ...
- python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框
最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...