关键问题在于: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