更快地读取带有浮点数字的文本文件,并存储在浮点矢量中
Reading text file with floating point numbers faster and storing in vector of floats
我有一个在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位(。
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 打印逐行存储的文本文件
- 将从格式化文本文件读取的文本数据存储到链表
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- C++ 使用存储在动态数组中的文本文件中的数据查找模式
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 读取文件并将其存储在unordered_map中时出现问题
- 使用矢量将文本文件中的输入存储到 2D 数组中
- OpenCV 4.2.0 文件存储分段错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 存储文件中的字符串,但是数组仍然为空?阵列大小的循环
- 存储文件c++中的集合
- 如何在存储文件之前查找可用内存
- 打开CV存储文件错误:
- C++在二进制树中存储文件
- 如何在Qt/C++应用程序中存储文件路径
- 存储文件中的键值数据
- SQLite,iCloud,也许还有Core Data——用于存储文件并与所有用户的设备共享?
- 如何在文件夹中存储文件的顺序编号