0

我有以下最小的工作示例,它说明了我当前如何从数据文件“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 个数字(甚至更多),所以我有兴趣有效地做到这一点。在我的示例中是否有一些基本的东西可能会减慢加载过程?

4

3 回答 3

1

如果您提前知道数字的数量,您可以告诉std::vector预分配空间。这将使push_back函数更有效。

其他优化技术包括内存映射文件双缓冲

于 2012-10-17T18:31:21.510 回答
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 文件 api 同步。在写入每个字符后,同步会强制 iostreams 库刷新。您可以通过以下方式禁用此同步:

std::cout.sync_with_stdio(false);
于 2012-10-17T18:31:42.410 回答
1

首先,您需要读取您可以读取的数据..

一种。打开文件并从中读取

湾。分配内存 复制其中文件的内容

C。内存映射文件

根据文件的大小,我会说 c 是最好的选择,因为你避免了分配和复制数据的成本,而且它比从文件中读取要快得多。

其次,您需要明显地解析内容,最好的方法是手动循环,请参阅http://tinodidriksen.com/2011/05/28/cpp-convert-string-to-double-speed/了解更多详细信息。我自己确实尝试过,这是处理大文件的方法。

第三..您需要预先分配存储结果的缓冲区,以最大限度地减少分配。

当然,您需要测量性能..找到热点..消除它们...冲洗并重复。

于 2012-10-17T21:35:47.747 回答