QTableWidget大数据文件显示(1000万行数据)

参考: 

(1条消息) c/c++ qt如何快速的解析(300MB-1G)大文件_江南又旧雨的博客-CSDN博客

上文记录了QTextEdit显示1000万行的数据的开发过程,对于QTableWidget显示大数据文件可以作为参考。

QTableWidge显示大数据文件有以下几点需要注意:

(1)读取大数据文件,采用下面代码是非常慢的,仅仅是读文件就需要花费30s左右:

  QFile file(path);
  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
		return;
  unsigned long count = 0;
  while (!file.atEnd()) {
		QByteArray line = file.readLine();
		count++;
		m_strList.append(line);
	}
file.close();

推荐使用:fgets(buf, BUFSIZE, ifp)或者fread(),读取文件,速度比较快。

如果不需要读取所有的文件内容,可以先建立文件映射,建立映射后用mmap直接从硬盘上读取需要的行数据,此种方式读取读取效率高,占用内存小,对文件的分页显示很有用处。对于文件映射,1G左右的文件,大概在1.2s左右可以完成文件映射,速度还是很快的。

(2)QTableWidge添加大量数据,每添加一行数据耗时0.5ms,一次全部添加完20万行,大概需要100秒左右,是非常耗时间的。更何况于1000万行数据,一下子全部加载,还会消耗很大的内存,软件可能会直接死机。

综上所述,对于QTableWidge显示大数据文件,有如下几点思路:

(1)动态文件加载,开启一个线程读文件,这样就不会因为读取文件时间长导致界面卡死;在QTableWidge采用分页显示,每次交互只加载需要在屏幕上显示的那些行数据,表格固定的是一百行,每次操作对这一百行数据进行刷新,虚拟出完整表格的效果。

测试:QTableWidge动态加载,显示1千万行数据,此种方法可以快速的显示界面,但是读取文件速度较慢,文件占用内存很大。

源码:

(1条消息) QTableWidge动态加载,显示1千万行数据,开启一个线程读文件,这样就不会因为读取文件时间长导致界面卡死资源-CSDN文库

(2)先去读全部的,再进行分页显示,只在表格需要在屏幕上显示的那些行填充数据,不显示的不填充数据,表格行数是数据的行数。

测试:QTableWidge分页显示1千万行数据,此种方法优化了文件的读取,可以快速的读取全部的文件内容,大概1.5s读取完1千万行,但是1千万行表格占用较大的内存,滑动条滑动会微卡。

源码:

(1条消息) QTableWidget只在表格需要在屏幕上显示的那些行填充数据,不显示的不填充数据,表格行数是数据的行数资源-CSDN文库

(3)先去读全部的,再进行分页显示,表格固定的是一百行,每次操作对这一百行数据进行刷新,虚拟出完整表格的效果。

测试:QTableWidge分页显示1千万行数据,此种方法优化了文件的读取,可以快速的读取全部的文件内容,表格也只100行,占用内存较小。但是读取了全部大文件,文件占用的较大部分的内存。

 源码:

(2条消息) QTableWidget先去读全部的,再进行分页显示,表格固定的是一百行,每次操作对这一百行数据进行刷新,虚拟出完整表格的效果-C++文档类资源-CSDN文库

(4)文件映射

 如果文件很大,读取全部的数据会占用很大内存,推荐文件映射的方法,每次交互只读需要显示的文件数据。文件映射放置放置在主线程中,1G左右的文件,大概在1.2s左右可以完成文件映射;再进行分页显示,表格固定的是一百行,每次操作对这一百行数据进行刷新,虚拟出完整表格的效果。

测试:QTableWidge分页显示1千万行数据,建立mmap文件映射,只读取需要显示的部分文件内容,此种方式速度快,占用内存小,内存占用149MB左右,每次只读取显示部分的数据,推荐此种方式。

 源码:

(2条消息) QTableWidget大数据文件文件映射mmap-C++文档类资源-CSDN文库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值