C++ 有效地从数据文件加载数字

C++ 有效地从数据文件加载数字,c++,ifstream,C++,Ifstream,下面是一个简单的工作示例,它说明了我当前如何从数据文件“info.txt”加载一组数字: 我可能会加载50000-100000个数字(甚至更多),所以我对高效地加载感兴趣。在我的示例中,是否有一些基本的东西我遗漏了,可能会减慢加载过程?如果您提前知道数字的数量,您可以告诉std::vector预先分配空间。这将使推回功能更加有效 其他优化技术包括内存映射文件和双缓冲。如果您提前知道数字的数量,您可以告诉std::vector预先分配空间。这将使推回功能更加有效 其他优化技术包括内存映射文件和双缓

下面是一个简单的工作示例,它说明了我当前如何从数据文件“info.txt”加载一组数字:


我可能会加载50000-100000个数字(甚至更多),所以我对高效地加载感兴趣。在我的示例中,是否有一些基本的东西我遗漏了,可能会减慢加载过程?

如果您提前知道数字的数量,您可以告诉
std::vector
预先分配空间。这将使
推回功能更加有效


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

如果您提前知道数字的数量,您可以告诉
std::vector
预先分配空间。这将使
推回功能更加有效


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

当您要向std::vector添加大量元素时,在向其添加元素时,向量将增长。当向量增长时,通常需要将所有数据复制到新的缓冲区,您可以告诉向量在添加大量元素之前保留大量空间,以降低增长和复制操作的数量:

std::vector<int> v(5000);

当您要向std::vector添加大量元素时,在向其添加元素时,该向量将增长。当向量增长时,通常需要将所有数据复制到新的缓冲区,您可以告诉向量在添加大量元素之前保留大量空间,以降低增长和复制操作的数量:

std::vector<int> v(5000);

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

a。打开文件并从中读取

b。alocate内存复制其中文件的内容

c。内存映射文件

根据文件的大小,我认为c是最好的选择,因为它避免了查找和复制数据的成本,而且比直接读取文件快得多

其次,您需要解析内容 另外,最好的方法是用手卷一圈 有关更多详细信息,请参阅。我自己也尝试过,这是处理大文件的方法

第三,您需要预先定位用于存储结果的缓冲区,以便将位置最小化


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

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

a。打开文件并从中读取

b。alocate内存复制其中文件的内容

c。内存映射文件

根据文件的大小,我认为c是最好的选择,因为它避免了查找和复制数据的成本,而且比直接读取文件快得多

其次,您需要解析内容 另外,最好的方法是用手卷一圈 有关更多详细信息,请参阅。我自己也尝试过,这是处理大文件的方法

第三,您需要预先定位用于存储结果的缓冲区,以便将位置最小化


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

这些数字不是整数。这个文件的结构是固定的吗?我是说,你能用二进制文件吗?对不起,我指的是双精度,不是整数。不幸的是,我不能使用二进制文件。std流能够处理本地化,并为您执行大量错误检查。如果您能负担得起更少的检查,那么您可以加快使用更基本的函数,如std::ftoi或boost::lexical\u cast。当然,速度取决于您的std库实现。这些数字不是整数。这个文件的结构是固定的吗?我是说,你能用二进制文件吗?对不起,我指的是双精度,不是整数。不幸的是,我不能使用二进制文件。std流能够处理本地化,并为您执行大量错误检查。如果您能负担得起更少的检查,那么您可以加快使用更基本的函数,如std::ftoi或boost::lexical\u cast。当然,速度的提高取决于您的std库实现。对于2和10个初始元素的比例因子,它需要14个分配+拷贝,总共访问2.5 MB RAM(4字节的65k整数)。我认为这是个小问题。
std::vectorv(5000)不保留,但创建元素,值初始化它们=>O(n)。参见23.3.6.2对于2和10个初始元素的比例因子,它是14个分配+拷贝,访问总计2.5 MB RAM(4字节的65k整数)。我认为这是个小问题。
std::vectorv(5000)不保留,但创建元素,值初始化它们=>O(n)。见23.3.6.2
std::vector<int> v(5000);
std::vector<int> v;
v.reserve(10000); // ensure the vector has a capacity of at least 10k elements
std::cout.sync_with_stdio(false);