gpt4 book ai didi

c++ - 如何加快将文本文件加载到多 vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:58 25 4
gpt4 key购买 nike

我必须加载带有数据的大文件(几 GB)并且我想将它们加载到二维 vector 中。下面的代码可以完成这项工作,但速度非常慢。更具体地说,目标是获取第 2 列中的值等于 index(_lh,_sh) 的所有行。然后排除第 4 列值与 line+1 和 line-1 相同的行。现在,我是 c++ 的新手,我通常用 Python 编写代码(已经有针对这个问题的工作代码)。但我需要它尽可能快,所以我试图将我的 python 代码重写为 C++。但它现在比 Python 运行得慢(并且只实现了将数据转换为 vector )......所以在我继续之前,我想改进它。根据我在类似问题中的发现,问题是动态 vector .push_back() 和 getline()。

我对类似问题中提到的映射和 block 加载感到很困惑,所以我无法根据这些更改代码。

你能帮我优化这段代码吗?

谢谢。

#include <iostream>
#include <sstream>
#include <fstream>
#include <array>
#include <string>
#include <vector>

using namespace std;

int pixel(int radek, int sloupec, int rozmer = 256) {
int index = (radek - 1) * rozmer + sloupec;
int index_lh = (index - rozmer - 1);
int index_sh = (index - rozmer);
int index_ph = (index - rozmer + 1);
int index_l = (index - 1);
int index_p = (index + 1);
int index_ld = (index + rozmer - 1);
int index_sd = (index + rozmer);
int index_pd = (index + rozmer + 1);
array<int, 9> index_all = { {index, index_lh, index_sh, index_ph, index_l, index_p, index_ld, index_sd, index_pd } };
vector<vector<string>> Data;
vector<string> Line;
string line;

for (int m = 2; m < 3; m++) {
string url = ("e:/TPX3 - kalibrace - 170420/ToT_ToA_calib_Zn_" + to_string(m) + string(".t3pa"));
cout << url << endl;
ifstream infile(url);
if (!infile)
{
cout << "Error opening output file" << endl;
system("pause");
return -1;
}
while (getline(infile, line))
{
Line.push_back(line);
istringstream txtStream(line);
string txtElement;
vector<string> Element;
while (getline(txtStream, txtElement, '\t')){
Element.push_back(txtElement);
}
Data.push_back(Element);
}
}
cout << Data[1][0] << ' ' << Data[1][1] << ' ' << Data[1][2] << endl;
return 0;
}

int main()
{
int x = pixel(120, 120);
cout << x << endl;
system("pause");
return 0;
}

最佳答案

如果底层缓冲区经常被重新分配, vector 可能会变慢。 vector需要在一个连续内存的buffer上实现,每次超过buffer限制,就得分配一个新的更大的buffer,然后把旧buffer中的内容复制到新buffer中。如果你知道你需要多大的缓冲区(你不需要精确),你可以通过使用例如帮助程序分配适当大小的缓冲区。 Data.reserve(n)(其中 n 大约是您认为需要的元素数)。这确实会改变 vector 的“大小”,只是底层缓冲区的大小。作为结束语,我不得不说我从未真正对此进行过基准测试,因此这可能会也可能不会提高您程序的性能。

编辑:不过,我认为更有可能的是,性能有点受到 Data.push_back(Element); 行的限制,该行复制了 Element-vector。如果您使用的是 C++11,我相信可以通过执行 Data.emplace_back(std::move(Element)); 之类的操作来解决此问题,在这种情况下您无法更改Element 之后(它的内容被移动)。您还需要为 std::move 包含 memory

关于c++ - 如何加快将文本文件加载到多 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43557911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com