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欢迎三连!文章篇幅有限, ...
随机推荐
- 【转】用Linux命令行获取本机外网IP地址
$ curl ifconfig.me $ curl icanhazip.com $ curl ident.me $ curl ipecho.net/plain $ curl whatismyip.ak ...
- 面试中的Java链表
链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...
- C为变量提供了5中存储模型(类)
- linux修改TCP最大连接数
环境 操作系统: oracle-linux7.3 修改系统支持的最大TCP连接 最大tcp连接数和系统允许打开的最大文件数,用户允许打开的最大文件数,TCP网络连接可用的端口范围有关,取上述的最小值: ...
- 2.Ray-消息发布器与消息存储器
消息发布器: Ray是基于Event Sourcing设计的ES/Actor框架,ESGrain状态(State)的修改.ESGrain之间的通信默认使用RabbitMQ通信.消息的发布器主要是Rab ...
- vsftpd安装和使用 Linux系统和window系统
vsftpd 安装(Linux)一.安装系统环境 centos 6.9 64位二.vsftpd版本 vsftpd-2.2.2-24.el6.x86_64三.安装步骤1.安装 执行 yum -y ins ...
- 洛谷 [P4016] 负载平衡问题
贪心做法 第一眼看见觉得和均分纸牌差不多,然而因为这是环形的,并不能用均分纸牌的方法做,但是均分纸牌的思想仍然适用 首先我们假设平均数为sum1. 那么对于第1个人,我们假设他给第N个人K个糖果, 第 ...
- 对JavaScript中的静态属性和原型属性的理解
首先是在访问上的区别,当访问实例对象的某个属性但它本身没有时,它就会到原型中去查找,但不会去查找静态属性. // 实例对象不会去查找静态属性 function Foo(){} Foo.a = 1; v ...
- linux下ACE的编译与安装
1.环境变量的设置vim /etc/profile 2.然后输入export ACE_ROOT=/root/ACE/ACE_wrappers export MPC_ROOT=$ACE_ROOT/MPC ...
- Hot Research Topics