使用浮点数快速读取文本文件并存储在浮点数向量中

时间:2014-05-29 17:23:36

标签: c++ visual-studio-2010 text

我有一个用Visual Studio 2010编写的c ++代码,它读取一个文本文件(包含数以万计的空格分隔的浮点数).Code读取文本文件内容并将其存储到浮点向量中。我的问题是,代码花了很多时间来读取和复制到vector.Is有一个更快的方法来做这个。可以在visual studio c ++中完成的一些事情(使用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();
}

2 个答案:

答案 0 :(得分:3)

如果文件非常大,请考虑内存映射文件:Boost offer an excellent library以跨平台操作它们(你提到mmap是一个Posix-Unix命令,看起来你在Windows上开发)

另外,请考虑在向量中保留空间以避免动态重新分配     ReplayBuffer.reserve(expected_final_size);

注意:

  • 请勿使用!in.eof()来检查您是否阅读了文件it is a bad practice
  • 如果您不需要fileSizes,请不要计算它。

答案 1 :(得分:3)

如果文件适合您的地址空间,您可以mmap和。{ 然后在结果内存上使用istrstreamistrstream是 正式弃用,但它仍然存在,并且是唯一的 标准流将在这里工作。或者你可以自己写 内存streambuf,甚至可能比istrstream更快, 因为你不必支持寻求等等(尽管如此) 寻找istrstream也是一项相当简单的操作, 并且不应该对其余部分产生影响)。

除此之外,每一层抽象通常都需要花费 什么东西,所以它可能会更快(尽管不是 如果您使用strtod手动循环,那么必然非常如此。

在所有情况下,将通用浮点数转换为机器 浮点是一项昂贵的操作。如果你知道的话 关于你将看到的价值观及其格式(例如,没有 科学记数法,一定范围内的值,最大值 小数点后的位数),可以写 转换例程比strtod快。这个 需要一些照顾,但如果你知道总数 数字中的十进制数字将始终生成一个值 将适合int,你可以做一个非常快速的int转换, 忽略'.',然后乘以它来缩放它 适当的浮点值(例如&#39; .001&#39;如果有的话 '.')之后的3位数。