windows上面硬盘文件读取速度问题

  今天,客户反应我这边交付的软件使用的时候读取文件太慢,一个640*480*100*4个字节(不到两百兆)的文件需要读48秒。

我一直以为是硬盘速度的限制,与代码优化无关,不料客户反映国外的软件(PI)可以做到几秒就读取完毕,不由得让我回头好好查查代码。

  其实不然。具体看代码:

 原来的读取方式是一个数据一个数据的读,

 float tempdata;   
if(file.Open(filepath,CFile::modeRead)) { for (int num=0;num<frames;num++) { for(int i=0;i<ArraySize;i++) { file.Seek(80+(num*ArraySize+i)*sizeof(float),CFile::begin); if (file.Read(&tempdata,sizeof(float)))//一个数据一个数据的读 { tempdata+=2; alldata[num*ArraySize+i]=tempdata*(vmax-vmin)/4+vmin;// Vmean[i]+=tempdata*(vmax-vmin)/4+vmin; } } } for(int i=0;i<ArraySize;i++) { Vmean[i]=Vmean[i]/frames; } return 1; } else { AfxMessageBox("Open file failed!"); return FALSE; }

新的方法是,整块数据读入数组:

float tempdata;
if
(file.Open(filepath,CFile::modeRead)) { file.Seek(80,CFile::begin); if (file.Read(alldata,ArraySize *frames*sizeof(float))) //整块读取 { for (int num=0;num<frames;num++) { for(int i=0;i<ArraySize;i++) { tempdata=alldata[num*ArraySize+i]; tempdata+=2; Tem[i]+=tempdata*64; alldata[num*ArraySize+i]=tempdata*(vmax-vmin)/4+vmin;//一定要这样? Vmean[i]+=tempdata*(vmax-vmin)/4+vmin; tempdata=0; } } for(int i=0;i<ArraySize;i++) { Vmean[i]=Vmean[i]/frames; Tem[i]=Tem[i]/frames; } file.Close(); return 1; } } //if(file.Open(filepath,CFile::modeRead)) //{ // for (int num=0;num<frames;num++) // { // for(int i=0;i<ArraySize;i++) // { // file.Seek(80+(num*ArraySize+i)*sizeof(float),CFile::begin); // if (file.Read(&tempdata,sizeof(float))) // { // tempdata+=2; // alldata[num*ArraySize+i]=tempdata*(vmax-vmin)/4+vmin;//一定要这样? // Vmean[i]+=tempdata*(vmax-vmin)/4+vmin; // // } // } // } // for(int i=0;i<ArraySize;i++) // { // Vmean[i]=Vmean[i]/frames; // } // return 1; //} else { AfxMessageBox("Open file failed!"); return FALSE; }

  整个读取速度得到极大提升,大概从48秒直接提升到一秒。
  由此可以引发对文件I/O的思考。

 

posted @ 2016-04-15 16:39  filmskin  阅读(686)  评论(0)    收藏  举报