我有以下最小的工作示例,它说明了我当前如何从数据文件“info.txt”中加载一组数字:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main() {
double temp_var;
vector<double> container_var;
ifstream test("info.txt");
while(test>>temp_var)
{
container_var.push_back(temp_var);
}
cout << container_var[0] << endl;
return 0;
}
文件“info.txt”包含表格
的整数1.0
2.1
3.6
...
我可能会加载50.000-100.000个数字(甚至更多),所以我有兴趣有效地做到这一点。在我的例子中,我是否遗漏了一些可能会减慢加载过程的有趣的东西?
答案 0 :(得分:1)
如果您提前知道数量,可以告诉std::vector
预分配空间。这将使push_back
函数更有效。
其他优化技术包括内存映射文件和双缓冲。
答案 1 :(得分:1)
当您要向std :: vector添加大量元素时,向量将在向其添加元素时增长。当向量生成时,通常需要将所有数据复制到新缓冲区,在添加大量元素之前,可以告诉向量保留大量空间,以保持增长和复制操作的数量更低:
std::vector<int> v(5000);
以上将创建一个已包含5000个元素的向量(默认初始化)。通过调用std :: vector :: reserve():
,可以在构造后保留更多空间std::vector<int> v;
v.reserve(10000); // ensure the vector has a capacity of at least 10k elements
虽然我认为这是实际问题,但问题也可能出在cout << container[0] << endl
行。 std :: endl刷新文件缓冲区,因此通常很慢。第三个原因可能是std::cout
流与C-stdio文件apis同步。在每个字符写入后,同步会强制iostreams库进行刷新。您可以使用以下命令禁用此同步:
std::cout.sync_with_stdio(false);
答案 2 :(得分:1)
首先,您需要阅读可以使用的数据..
一个。打开文件并从中读取
湾分配内存复制文件中的内容
℃。内存映射文件
根据文件的大小,我会说c是最好的选择,因为你可以避免分配和复制数据的成本,而且它比文件中的天真读取要快得多。
其次你需要解析内容 显然,最好的方法是手动循环 有关详细信息,请参阅http://tinodidriksen.com/2011/05/28/cpp-convert-string-to-double-speed/。我自己尝试过,这是获取大文件的方法。
第三..你需要预先分配存储结果的缓冲区,以便最大限度地减少分配。
当然你需要测量性能..找到热点..消除它们......冲洗并重复。