【问题标题】:Reading text file with floating point numbers faster and storing in vector of floats更快地读取带有浮点数的文本文件并存储在浮点向量中
【发布时间】:2014-05-29 17:23:35
【问题描述】:

我有一个用 Visual Studio 2010 编写的 C++ 代码,它读取一个文本文件(其中包含由空格分隔的数万个浮点数)。代码读取文本文件内容并将其存储到浮点向量中。我的问题是,代码需要花费大量时间来读取和复制到矢量。有没有更快的方法来做到这一点。可以在 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();
}

【问题讨论】:

  • 所有可以替换为vector&lt;float&gt; ReplayBuffer{std::istream_iterator&lt;float&gt;(in &gt;&gt; std::fixed &gt;&gt; std::setprecision(3)), std::istream_iterator&lt;float&gt;()}
  • 输入时不使用精度和格式字段。并且您在外循环中的循环条件可能会导致无限循环(例如,如果存在格式错误)。
  • @0x499602D2 这将是读取文件的最简单方法(并且不会导致格式错误的无限循环)。
  • 这将是迄今为止最好的,但不幸的是OP使用的是VS2010并且没有标记C++11

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


【解决方案1】:

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

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

注意:

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

【讨论】:

    【解决方案2】:

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

    除此之外,每个抽象层通常都需要花费 一些东西,所以它可能会更快(虽然不是 一定非常)如果你手动循环,使用strtod

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多