我有一个用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();
}
答案 0 :(得分:3)
如果文件非常大,请考虑内存映射文件:Boost offer an excellent library以跨平台操作它们(你提到mmap是一个Posix-Unix命令,看起来你在Windows上开发)
另外,请考虑在向量中保留空间以避免动态重新分配 ReplayBuffer.reserve(expected_final_size);
注意:
fileSizes
,请不要计算它。答案 1 :(得分:3)
如果文件适合您的地址空间,您可以mmap
和。{
然后在结果内存上使用istrstream
。 istrstream
是
正式弃用,但它仍然存在,并且是唯一的
标准流将在这里工作。或者你可以自己写
内存streambuf,甚至可能比istrstream
更快,
因为你不必支持寻求等等(尽管如此)
寻找istrstream
也是一项相当简单的操作,
并且不应该对其余部分产生影响)。
除此之外,每一层抽象通常都需要花费
什么东西,所以它可能会更快(尽管不是
如果您使用strtod
手动循环,那么必然非常如此。
在所有情况下,将通用浮点数转换为机器
浮点是一项昂贵的操作。如果你知道的话
关于你将看到的价值观及其格式(例如,没有
科学记数法,一定范围内的值,最大值
小数点后的位数),可以写
转换例程比strtod
快。这个
需要一些照顾,但如果你知道总数
数字中的十进制数字将始终生成一个值
将适合int
,你可以做一个非常快速的int转换,
忽略'.'
,然后乘以它来缩放它
适当的浮点值(例如&#39; .001&#39;如果有的话
'.'
)之后的3位数。