更快地读取带有浮点数字的文本文件,并存储在浮点矢量中

Reading text file with floating point numbers faster and storing in vector of floats

本文关键字:存储 文件 读取 数字 文本      更新时间:2023-10-16

我有一个在visual studio 2010中编写的c++代码,它读取一个文本文件(其中包含数万个用空格分隔的浮点数字(。代码读取文本文件内容并将其存储到浮点向量中。我的问题是,代码需要花费大量时间来读取和复制到向量。有没有更快的方法。一些可以在visualstudioc++中完成的事情(使用boost库或mmap(

vector<float> ReplayBuffer;
ifstream in;
in.open("fileName.txt");
if(in.is_open())
{
    in.setf(ios::fixed);
    in.precision(3);
   in.seekg(0,ios::end);
   fileSizes = in.tellg();
   in.seekg(0,ios::beg);
   while(!in.eof())
   {
   for(float f;in>>f;)
       ReplayBuffer.push_back(f);
   }
   in.close();
}

如果你的文件很大,可以考虑内存映射文件:Boost提供了一个优秀的库来跨平台操作它们(你提到了mmap,它是一个Posix Unix命令,看起来你是在Windows上开发的(

此外,请考虑在向量中保留空间,以避免动态重新定位ReplayBuffer.reReserve(expected_final_size(;

注:

  • 请勿使用!在.eof((中检查是否已完成文件读取,这是一种糟糕的做法
  • 如果你不需要fileSizes,就不要计算它

如果文件适合您的地址空间,您可以mmap它和则在得到的存储器上使用CCD_ 3。istrstream为正式弃用,但它仍然存在,并且是唯一在这里工作的标准流。或者你可以自己写甚至可能比CCD_ 5更快的存储器流buf,因为你不必在上面支持寻求等等(尽管在CCD_ 6上搜索也是相当琐碎的操作,并且不应该对其余部分产生太大影响(。

除此之外,每一层抽象通常都要付出代价有些东西,所以它可能会更快(尽管不是如果使用strtod手动循环。

在所有情况下,将通用浮点转换为机器浮点运算是一项昂贵的运算。如果你知道什么关于您将看到的值及其格式(例如科学记数法,某一范围内的值,具有最大值小数点后的位数(,可以写转换例程将比CCD_ 8更快。这需要一些小心,但如果你知道数字中的十进制数字将始终产生一个值将适合int,您可以进行非常快速的int转换,忽略'.',然后通过乘以适当的浮点值(例如,如果存在'.'之后的3位(。