关键问题在于:QFile读取double型二进制数据流,只有两种方法处理数值。

一是通过QDataStream一个一个double读取,存储在一个QVector<double>中

二是通过QFile read(int len) 返回在一个QByteArray中,然后对这个QByteArray进行QDataStream序列化读取。

问题就出现在这个序列化读取中,这种需要循环读取值,耗费了大量时间。

不如C语言的一句size_t fread(    void* buffer,    size_t size,    size_t count,    FILE* stream );能迅速的读取进入一个Double[]数组中,时间消耗差距是几十倍。

可以细看下面两类代码,看看他们的时间消耗。

/***函数介绍:读取裸数据文件*输入参数:无*返回值:  无*/
void RawData::readNakedDataFile()
{QList< QVector<float> * > dataList;QList< float * > listList;QTime t;double  duration;FILE *stream;QFile file("NakedData/nakedData.raw");if (!file.open(QIODevice::ReadOnly))return;QDataStream in(&file);in.setVersion(QDataStream::Qt_4_6);in.setByteOrder(QDataStream::LittleEndian);in.setFloatingPointPrecision(QDataStream::SinglePrecision);float m = 0;t.start();qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zz");for(int i = 0;i < 2; i++){QVector<float>  *data = new QVector<float>();for(int j = 0; j <1152*16; j++){in >> m ;data->append(m);//qDebug() <<"输出:"<< m << "" << j;}dataList.append(data);}duration = t.elapsed();qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zz");qDebug() << "时间"  <<duration;file.close();***********C fread 读取成功************////float list[16*1152];if( fopen_s( &stream, "NakedData/nakedData.raw", "r+b" ) !=NULL )return;t.restart();qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zz");for(int i = 0; i < 2; i ++){float * list = new float[1152*16];fread( list, sizeof(float), 1152*16, stream );//for(int i = 0; i < 16*1152;i++)//qDebug() << list[i] << "" << i;listList.append(list);}qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zz");duration = t.elapsed() ;qDebug() << "时间" <<duration;fclose(stream);//打印两种读取结果,判断是否一致//for(int i = 0; i < 2; i ++)//{//    QVector<float> *dataVector = dataList.at(i);//    float * list = listList.at(i);//    for(int j = 0; j < 1152*16; j++)//    {//        qDebug() <<"data:["<<i<<"]["<< j <<"]"<<dataVector->at(j) ;//        qDebug() <<"list:["<<i<<"]["<< j <<"]"<< *(list++) ;//    }//}
}

当循环中的i为2圈的时候,消耗时间分别为 ms

当循环中的i为10圈的时候,消耗时间分别为 ms

当循环中的i为100圈的时候,消耗时间分别为 ms

当循环中的i为1000圈的时候,消耗时间分别为 ms

=============下面调整一下Qt读取文件的方法====================

/***函数介绍:读取裸数据文件*输入参数:无*返回值:  无*/
void RawData::readNakedDataFile()
{QList< QVector<float> * > dataList;QList< float * > listList;QTime t;double  duration;FILE *stream;QFile file("NakedData/nakedData.raw");if (!file.open(QIODevice::ReadOnly))return;float m = 0;t.start();qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zzz");for(int i = 0;i < 4; i++){QByteArray array = file.read(1152*16*4);QDataStream in(&array,QIODevice::ReadOnly);in.setVersion(QDataStream::Qt_4_6);in.setByteOrder(QDataStream::LittleEndian);in.setFloatingPointPrecision(QDataStream::SinglePrecision);QVector<float>  *data = new QVector<float>();for(int j = 0; j <1152*16; j++){in >> m ;data->append(m);}dataList.append(data);}duration = t.elapsed();qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zzz");qDebug() << "时间"  <<duration;file.close();***********C fread 读取成功************////float list[16*1152];if( fopen_s( &stream, "NakedData/nakedData.raw", "r+b" ) !=NULL )return;t.restart();qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zzz");for(int i = 0; i < 4; i ++){float * list = new float[1152*16];fread( list, sizeof(float), 1152*16, stream );listList.append(list);}qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zzz");duration = t.elapsed() ;qDebug() << "时间" <<duration;fclose(stream);for(int i = 0; i < 4; i ++){QVector<float> *dataVector = dataList.at(i);float * list = listList.at(i);for(int j = 0; j < 1152*16; j++){qDebug() <<"data:["<<i<<"]["<< j <<"]"<<dataVector->at(j) ;qDebug() <<"list:["<<i<<"]["<< j <<"]"<< *(list++) ;}}
}

当循环中的i为0圈的时候,消耗时间分别为 ms

当循环中的i为10圈的时候,消耗时间分别为 ms

当循环中的i为100圈的时候,消耗时间分别为 ms

当循环中的i为1000圈的时候,消耗时间分别为 ms

QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件相关推荐

  1. python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法...

    我有一个处理脚本,用于提取"uint16"类型的二进制数据文件,并一次以6400块的形式进行各种处理.该代码最初是用Matlab编写的,但由于分析代码是用 Python编写的,我们 ...

  2. c语言读取文件函数,C语言文件操作详细分析:读取文件(fread函数使用)

    C语言文件操作详细分析:读取文件(fread函数使用) 这里详细介绍了C语言读取文件的函数fread的使用说明,参照了MSDN的说明,同时加入自己的经验让大家学的更加明白. C语言读取文件函数frea ...

  3. 【Unity3D读取数据】(四)Excel文件操作(创建、读取、写入、修改)

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  4. 【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  5. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

  6. c++读取txt文件中的数字_在Python中读取包中的数据文件的三种方式

    我们知道,写Python代码的时候,如果一个包(package)里面的一个模块要导入另一个模块,那么我们可以使用相对导入: 假设当前代码结构如下图所示: 其中test_1是一个包,在util.py里面 ...

  7. Matlab读取二进制数据文件

    第一步:函数fopen打开文件 fid=fopen('文件名',读取方式) fid:句柄值 小于0表示打开失败:大于0表示打开成功 文件名:字符串,使用单引号(本文例子'savedata.dat') ...

  8. IOS 读二进制数据文件

    IOS 读二进制数据文件 在开发项目的过程中,我们有可能遇到上面这图片展示的数据.其实这些数据是存放到文件中的二进制数据.记得大学的时候老师带着我们写了一个记账类软件,当时就是把账单里面的数据存放到文 ...

  9. python怎么读取txt文件并统计其字数-python读写excel等数据文件方法汇总

    python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python ...

最新文章

  1. php无极分类非递归_无限极分类算法,对你一定有帮助
  2. 社交网站将推动手游发展
  3. pyppeteer:比selenium更高效的爬虫利器
  4. php sql 长字符串 查找被包含的短字符串_PHP字符串
  5. vue element form 表单
  6. 大数据分析给企业带来哪些挑战
  7. 【面经】腾讯NLP实习面经(Offer已拿)
  8. Atitit doc mng 文档管理总结目录1. 主要几大内容 12. 存储管理 22.1. 一般来说 ,文档存储在IM网盘note邮箱blog wiki等地 22.2. 文档格式与体
  9. Mac下Chrome添加.crx浏览器插件
  10. SanDisk cz48 16G TLC U盘量产经验分享
  11. LabVIEW编程LabVIEW控制cRIO-9043例程与相关资料
  12. 计算机键盘没有fn,教您fn键设置方法
  13. 2021-2022 文旅市场研报与文旅策划案例(共80份)
  14. Echart3绘制世界地图连线中国城市
  15. 006 window7或虚拟机上不了网或DNS出问题
  16. CSS 滚动快照 Scroll Snap
  17. CorelDRAW苹果水晶球详细制作
  18. 介绍Jackson JsonParser解析json
  19. 邮箱POP3、SMTP和IMAP
  20. skywalking

热门文章

  1. Hive SemanticException
  2. IDEA部署项目和多余的项目删掉的演示
  3. 冒泡排序、递归、二分查找
  4. WindowServer2003中IIS6.0允许运行32位程序
  5. C#中的矩阵转换,应用.net GDI+
  6. mapreduce与spark的区别--内容详细
  7. 【Scala】Scala中特殊函数的使用(代码)
  8. app 怎么通过jmeter 进行性能测试
  9. tcp滑动窗口_面试必备TCP(三):滑动窗口
  10. C语言1013山东理工大学试题,山东理工大学史上最全C语言PPTC程序设计(2基本数据与运算).ppt...