快速读取浮动文本文件

时间:2017-05-10 20:20:17

标签: c++ performance parsing c++11

我有一个带有~4 mio浮点数的文本文件,即30MB,我想把它们读成<html> <head> </head> <body> <!-- multiline "comment" below using textarea style="display:none;" --> <textarea style="display:none;"> <script> alert("which won't show up.."); </script> Hello world! <!-- Look at me, I'm a comment :) --> <div>Yeah, whatever, I'm an element..</div> </textarea> <span>Who cares, span is the man, the only visible one anyway!</span> </body> </html>

我的代码非常简单,完成工作

vector<float>

问题是现代桌面工作站需要20到30秒。起初我假设我做了一些愚蠢的事情,但是我对代码的反应越多,我开始接受的就越多,可能只是将所有ascii浮点值解析为std::fstream is("data.txt", std::ios_base::in); float number; while (is >> number) { //printf("%f ", number); number_vec.push_back(number); }

所需的时间

然而,我记得Matlab几乎可以立即读取和解析同一个文件(磁盘速度似乎是极限),所以很明显我的代码效率非常低。

我唯一能想到的是提前在矢量中保留所需的元素,但它根本没有改善情况。

有人可以帮助我理解为什么吗?并且可能有助于编写更快的解决方案?

编辑文本文件如下所示:

  

152.00256 45.8569 5.87214 0.225 -0.0005 .....

即。一行,空格分隔。

1 个答案:

答案 0 :(得分:0)

请考虑查看@gsamaras和@Brad Allred分享的可能重复项。无论如何,我将尝试回答一个简单的答案,旨在保持代码简洁/友好,并考虑以下两个前提:

  • 您对文件有约束,既不会更改文件格式,也不会以文本方式显示文件格式。
  • 您希望继续使用STL,而不是寻找专门针对您所面临挑战的图书馆。

根据这些陈述的约束和思维方式,我的主要建议是预先分配容器,浮动向量作为内部iostream缓冲区:

  • 通过在标准向量中保留所需的大小来提高 number_vec 中的插入效果。这可以通过调用 reserve 来实现,如本stackoverflow post中所述。
  • 通过设置内部使用的缓冲区大小来提高iostream的性能。这可以通过调用 pubsetbuf 来实现,如other stackoverflow post中所述。