【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框架高性能模型视图代理框架千万级数据表分层查询优化的更多相关文章

  1. MySQL的count(*)的优化,获取千万级数据表的总行数[转]

    一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径,选择了用explain来获取总行数. 二.关于cou ...

  2. Qt MVC(模型-视图-代理)

    实习刚才是一段时间,公司这边就要求熟悉这个mvc.一般开始都是用tableview,前面的blog我都是使用listview居多,并且相对delegate这个使用的多余model.接下来说下model ...

  3. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  4. REORG TABLE命令优化数据库性能

    [转]DB2日常维护——REORG TABLE命令优化数据库性能     一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止 ...

  5. 常用CSS优化总结——网络性能与语法性能建议

    在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时多少会用到一些,但突然问我,很难把自己知道的都说出来.页面优化明显不是一两句能够说完的,这两天总结了一下 ...

  6. Android性能优化之布局优化

    最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不 ...

  7. 优化TableView性能

    优化tableView性能(针对滑动时出现卡的现象) (2013-08-02 11:18:15) 转载▼ 标签: ios tableview it 分类: 技术文档 在iOS应用中,UITableVi ...

  8. Web服务器性能监控分析与优化

    Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html

  9. Web前端性能优化之图片优化

    我自己的Blog:http://blog.cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到了互联网内容总量的62%,也就是说超过 ...

  10. 【转】Android性能优化之布局优化篇

     转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015 ...

随机推荐

  1. oeasy教您玩转python - 010 - # 不换行输出

    不换行输出 回忆上次内容 \n 就是换行 他对应着 ascii 字符的代码是(10)10进制 他的英文是 LF,意思是Line Feed 这样我就可以自由的控制哪里换行了! 可以做下面这个框架标题吗? ...

  2. Python elasticsearch-py类库基础用法

    实践环境 https://pypi.org/project/elasticsearch/ pip install elasticsearch==7.6.0 离线安装包及依赖包下载地址: https:/ ...

  3. 基于.NET开源、强大易用的短链生成及监控系统

    前言 今天大姚给大家分享一个基于.NET开源(MIT License).免费.强大易用的短链生成及监控系统:SuperShortLink. 项目介绍 SuperShortLink是一个基于.NET开源 ...

  4. python os.path 模块详解

    python os.path 模块详解 os.path.basename() 返回最后一项,通常是文件名os.path.dirname() 返回的是目录,不包含文件名os.path.split() 返 ...

  5. Jmeter函数助手21-evalVar

    evalVar函数用于执行变量表达式. 变量的名称:填入变量的名称name.注意不是引用变量${name} 1.evalVar函数和eval函数的区别:evalVar只能接收变量名称:eval能接收引 ...

  6. 【Java】Oshi 硬件信息读取库

    实现的功能: 用于开发服务器监控面板,获取服务器硬件参数 官方Github仓库地址: https://github.com/oshi/oshi Maven坐标: <!-- https://mvn ...

  7. 【Java】Map 映射接口 概述

    Map 映射接口 概述 Map是一个双列数据,存储K-V类型的数据 JDK1.2 - HashMap 是目前Map的主要实现类 JDK1.2 线程不安全的,效率高,可存储null的key和value ...

  8. 【JSON】JavaScript Object Notation JS对象表示规则

    什么是 JSON? JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. JSON采用完全独立于语言的文本格式 ...

  9. Python Pillow(PIL 第三方模块)和 cv2 (opencv第三方模块)对图片的 resize 操作 (缩放图片大小)

    PIL 模块的 resize  操作: 1.  从文件中读取图片,然后  resize  大小: import matplotlib.pyplot as plt import numpy as np ...

  10. 【转载】 在Ubuntu环境下,搜狗输入法乱码问题的解决

    原文作者:高坦的博客 | Tan's Blog 原文链接:https://www.cnblogs.com/gtscool/p/12234104.html本文采用 BY-NC-SA 许可协议.转载请注明 ...