【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化
简介
本文使用QT树状控件QTreeView快速展示SQLite数据库中的1000万条具有层次结构的数据记录,当然每次只展示一部分记录。基本思路是在初始化时只显示顶层结构的数据记录;在树状控件的某一个节点被用户操作展开时再即时到数据库中查询相应的数据记录并作为该节点的下层节点插入到树状控件中;在某一个节点被用户操作收缩时立即删除该节点的子节点。整个树状控件中总是只加载用户关心的数据,而不是加载所有数据,使得树状控件的显示和展开及收缩操作都在几毫秒到几十毫秒就能完成,从而极大的提升了应用程序的运行性能。另外,对于千万量级的数据库,对数据进行分层管理对于降低应用程序内存占用也发挥了举足轻重的价值。
文章目录
正文
QT高性能树状控件百万节点效果演示
QT高性能树状控件百万节点效果演示截图
本文描述之使用QT模型视图代理框架对1000万条记录数据表分层展示的运行效果参考视频如下:
视频:QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化效果
QT应用能不能快速展示千万级数据表中的数据? 看完补天云这个视频你就知道怎么回事了: QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化
QT高性能树状控件百万节点源代码:数据库层
数据库初始化
QT高性能树状控件百万节点效果演示千万条记录数据初始化代码
这里就是按照公司、分公司、部门、员工四个层级依次生成数据。员工记录1000万条。都是一些INSERT语句的执行,为了 节省篇幅,本文略去这些代码。
基础数据结构
本文介绍的QT高性能树状控件百万节点效果演示程序使用的一些基础数据结构定义如下所示:
QT高性能树状控件百万节点效果演示程序基础数据结构
QT高性能树状控件百万节点效果演示程序基础数据结构
QT高性能树状控件百万节点效果演示程序基础数据结构
公司查询
QT高性能树状控件百万节点效果演示程序公司查询数据库的源代码。
QT高性能树状控件百万节点效果演示程序公司查询
为了节省篇幅,这里只写了关键代码,省去了一些错误判断的辅助代码。
分公司查询
QT高性能树状控件百万节点效果演示程序分公司查询数据库的源代码。
QT高性能树状控件百万节点效果演示程序分公司查询
部门查询
QT高性能树状控件百万节点效果演示程序部门查询数据库的源代码。
QT高性能树状控件百万节点效果演示程序部门查询
员工查询
QT高性能树状控件百万节点效果演示程序员工查询数据库的源代码。
QT高性能树状控件百万节点效果演示程序员工查询
QT高性能树状控件百万节点源代码:界面层
界面初始化
窗口类的头文件如下所示。窗口中包含了树状控件。
QT高性能树状控件百万节点效果演示程序界面
QT高性能树状控件百万节点效果演示程序界面
树状控件初始化
QT高性能树状控件百万节点效果演示程序树状控件初始化顶层节点(根节点)的源代码。
QT高性能树状控件百万节点效果演示程序界面树状控件初始化
在初始时刻,只加载了顶层节点的数据,也就是公司级别的数据,而暂时没有立即加载分公司数据和部门数据以及员工数据。这样极大的降低的应用程序的内存占用量。数据库中存在1000万条员工记录,如果一次性全部加载到进程中,将占用很多的内存。
树状控件节点展开事件处理
QT高性能树状控件百万节点效果演示程序节点展开事件处理的源代码。
QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理
备注:
(a)根据这些ID判断是哪一个层级的节点。
公司节点展开分公司列表的情况:
QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理
分公司节点展开部门列表的情况:
QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理
部门节点展开员工列表的情况:
QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理
在本文介绍的实例中,按照数据记录本身的层次关系,采用数据分层管理的策略,在节点展开时即时从数据库加载该节点的下级数据,在节点收缩时删除该节点的下级节点。这种策略通常可以很好的避免应用程序的内存占用量随着数据库中的数据记录的数量规模的增加而增长的情况。显然,本文介绍的实例中,即使数据库中存在1000万条员工记录,但是由于每次只加载1000条记录,因此内存占用量和数据规模几乎没有关系。
数据库查询过程中动态创建的这些自定义数据条目(ButianyunItem)保存在department.items这个列表中,这些条目的内存什么时候释放呢? 答案是这个函数执行完之后自动释放,看一下ButianyunItem的析构函数就明白了。
QT高性能树状控件百万节点效果演示程序数据条目析构函数
树状控件节点收缩事件处理
下面是QT高性能树状控件百万节点效果演示程序节点收缩事件处理的源代码。
QT高性能树状控件百万节点效果演示程序节点收缩事件处理
备注:
(a)根据这些ID判断是哪一个层级的节点。
公司节点收缩的情况:
QT高性能树状控件百万节点效果演示程序节点收缩事件处理
分公司节点收缩的情况:
部门节点收缩的情况:
QT高性能树状控件百万节点效果演示程序节点收缩事件处理
总结
在千万量级数据记录的SQLite数据库应用场景中,如何解决数据量大导致的数据加载时间长,数据展示性能差的问题呢? 鉴于这种数据记录之间的层级关系和QT树状控件展开和收缩操作的特点,本文介绍了一种在使用数据库的索引结构的基础上,按需加载数据的方法,避免了一次性加载所有数据产生的一些性能问题, 并将树状控件的展示和节点操作消耗的时间优化到了几毫秒到几十毫秒这种可接受的范围;同时内存占用量也降低到了基本与数据规模无关的程度。
QT性能优化技术博客专栏:
QT性能优化
如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化的更多相关文章
- MySQL的count(*)的优化,获取千万级数据表的总行数[转]
一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径,选择了用explain来获取总行数. 二.关于cou ...
- Qt MVC(模型-视图-代理)
实习刚才是一段时间,公司这边就要求熟悉这个mvc.一般开始都是用tableview,前面的blog我都是使用listview居多,并且相对delegate这个使用的多余model.接下来说下model ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- REORG TABLE命令优化数据库性能
[转]DB2日常维护——REORG TABLE命令优化数据库性能 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止 ...
- 常用CSS优化总结——网络性能与语法性能建议
在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时多少会用到一些,但突然问我,很难把自己知道的都说出来.页面优化明显不是一两句能够说完的,这两天总结了一下 ...
- Android性能优化之布局优化
最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不 ...
- 优化TableView性能
优化tableView性能(针对滑动时出现卡的现象) (2013-08-02 11:18:15) 转载▼ 标签: ios tableview it 分类: 技术文档 在iOS应用中,UITableVi ...
- Web服务器性能监控分析与优化
Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html
- Web前端性能优化之图片优化
我自己的Blog:http://blog.cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到了互联网内容总量的62%,也就是说超过 ...
- 【转】Android性能优化之布局优化篇
转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015 ...
随机推荐
- JavaScript 探究[] == ![]结果为true,而 {} == !{}却为false
console.log( [] == ![] ) // true console.log( {} == !{} ) // false 在比较字符串.数值和布尔值的相等性时,问题还比较简单.但在涉及到对 ...
- 自制基于simplefoc大功率驱动板想法的由来,同时欢迎有相同兴趣的F友一起来玩。。。
前一阵子,偶然在B站上看了一个simplefoc的介绍视频,代码简洁.算法精妙让人佩服,更让人佩服的是:开源!遂!搜索之!不搜不知道一搜吓一跳,发现太OUT了,原来玩这个算法的人这么多,让我这个整天沉 ...
- Jmeter函数助手35-property
property函数用于获取jmeter属性值. 属性名称:填入jmeter的属性名称 存储结果的变量名(可选) 默认值:缺省值,当获取属性值为空时则返回该值 1.查看jmeter全局属性,测试计划右 ...
- Jmeter参数化2-读取文件
如果你想要jmeter批量生成 指定 的参数值数据,可以使用导入文件参数化方法来实现 下面讲述两种jmeter读取文件参数值方法:"CSV 数据文件设置"."函数助手&q ...
- CentOS安装RustDesk自建服务器
一.安装node.js 1.下载并解压 [root@VM-8-2-centos src]# cd /usr/local # 下载node文件 [root@VM-8-2-centos local]# w ...
- 【Redis】06 事务
Redis事务 可以一次执行多个命令,本质是一组命令的集合. 一个事务中的 所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞 官方说明: https://redis.io/topi ...
- 日本联合研究团队发布 Fugaku-LLM——证明大型纯 CPU 超算也可用于大模型训练
相关: https://mbd.baidu.com/newspage/data/landingsuper?context={"nid"%3A"news_101396655 ...
- python中多进程下通信使用管道Pipe与队列 Queue 的区别: Multiprocessing - Pipe vs Queue
参考: https://stackoverflow.com/questions/8463008/multiprocessing-pipe-vs-queue ====================== ...
- Ubuntu系统下python模块graphviz运行报错:graphviz.backend.execute.ExecutableNotFound: failed to execute PosixPath(‘dot‘)
代码中需要运行python模块graphviz,安装: pip install graphviz 运行后报错: graphviz.backend.execute.ExecutableNotFound: ...
- css手撕奥运五环
巴黎奥运会正如火如荼地进行,本文来使用 CSS 来画一个奥运五环.奥运五环是相互连接的,因此在视觉上会产生重叠效果,这也是实现五环最有挑战性的部分.接下来,将利用 CSS 的伪元素,巧妙地实现环环相扣 ...