快速读取带有数字c ++的二进制文件的问题

时间:2017-05-23 16:20:39

标签: c++ performance binary

我知道这些话题经常存在。但是我无法解释自己的结果很慢。

我的任务:从文件中读取每秒2.2M点数(更好)并在3d OpenCv窗口中显示它们。

我尝试以不同的方式阅读:

  • 笛卡尔协调系统(x,y,z)全部__int16 650.000点/秒
  • 球面坐标系(phi,theta,distance)all __int16 560.000 Points /秒
  • 球面坐标系(距离)__ int16 1.384.000每秒点数并从序列中计算出phi和theta(这可能在将来有可能,但现在我没有相等角度距离的点)

我有一个SSD并在发布模式下运行。 所以我认为它不能成为一个瓶颈问题。

它是一个二进制文件,我使用float。系统是32位,我将获得2Byte值。

我的错误是什么?请给我一个建议。 我的代码用于读取球面坐标系(phi,theta,distance)

全球

 Point *pvertex=nullptr;
 pvertex=new Point[pointsToShow];

readPoints()

RealTime=clock();
std::ifstream FFile;
FFile.open ("read.txt",std::ifstream::in|std::ifstream::binary);

while (FFile!=NULL)
{
    FFile.read((char *)&fphi,sizeof(float));
    FFile.read((char *)&ftheta,sizeof(float));
    FFile.read((char *)&fdistance,sizeof(float));

    pvertex[position].x = fdistance* sin(ftheta)*cos(fphi);
    pvertex[position].z = fdistance* sin(ftheta)*sin(fphi);
    pvertex[position].y = fdistance* cos(ftheta);
    position++;
}

clock_t ende=clock();
if(ende-RealTime>0)
    printf("%lld\n", (long long)(ende-RealTime+(pointsToShow/(ende-RealTime))*1000));

1 个答案:

答案 0 :(得分:1)

您可以在Linux上read(),在Windows上fstream创建内存映射,而不是使用mmapCreateFileMapping

通过这种方式,您可以像访问内存(直接来自操作系统磁盘缓存)一样访问数据,而不是将较小的块读取并复制到用户模式缓冲区。