gpt4 book ai didi

c++ - 在 C++ 中将大型文本文件快速读取为一维结构

转载 作者:行者123 更新时间:2023-11-30 05:25:23 26 4
gpt4 key购买 nike

我需要快速读取一批最大 20mb 的文本文件。

文本文件采用格式。数字需要采用 double 格式,因为某些其他文件可能具有 3 位小数精度:

0 0 29 175 175 175 175 174 
0 1 29 175 175 175 175 174
0 2 29 28 175 175 175 174
0 3 29 28 175 175 175 174
0 4 29 29 175 175 175 174
.
.
.

我想将每行的最后六个数字存储到一个像这样的一维结构中,这样它就可以跳过前两列。它基本上转置每一列并水平连接每个转置的列:

29 29 29 29 29 175 175 28 28 29 175 175 175 175 175...

这是我的类(class)尝试这样做对我的目的来说太慢了。

void MyClass::GetFromFile(std::string filename, int headerLinestoSkip, int ColumnstoSkip, int numberOfColumnsIneed)
{
std::ifstream file(filename);
std::string file_line;
double temp;
std::vector<std::vector<double>> temp_vector(numberOfColumnsIneed);

if(file.is_open())
{
SkipLines(file, headerLinestoSkip);
while(getline(file, file_line, '\n'))
{
std::istringstream ss(file_line);
for(int i=0; i<ColumnstoSkip; i++)
{
ss >> temp;
}

for(int i=0; i<numberOfColumnsIneed; i++)
{
ss >> temp;
temp_vector[i].push_back(temp);
}
}

for(int i=0; i<numberOfColumnsIneed; i++)
{
this->ClassMemberVector.insert(this->ClassMemberVector.end(), temp_vector[i].begin(), temp_vector[i].end());
}

}

我读到内存映射文件可能会有帮助,但我尝试将其放入我需要的一维结构中的尝试并未成功。非常感谢某人的例子!

最佳答案

如您所示,使用 20mb 和短线,大约有 500 000 行。了解这一点后,有几个因素可能会降低您的代码速度:

  • I/O:以目前的硬件和操作系统性能,我无法想象它在这里发挥作用;
  • 解析/转换。您读取每一行,从中构建一个字符串流,然后提取数字。这可能是一种开销,尤其是在某些 C++ 实现中,其中流提取比旧的 sscanf() 慢。我可能是错的,但我再次不确定这种开销是否会如此巨大。
  • vector 的内存分配。这绝对是第一个要寻找的地方。 vector 具有大小和容量。每次添加超出容量的项目时,都需要重新分配 vector ,这可能需要移动并再次移动其所有内容。

我强烈建议您使用探查器执行代码以确定瓶颈。手动计时在这里会很困难,因为你的循环包含所有潜在的问题,但每次迭代肯定会很快 std::chrono以足够的精度测量不同的回路部分。

如果您不能使用分析器,我建议您使用文件大小粗略估计行数,然后取一半。 Pre-reserve然后是每个 temp_vector[i] 中相应的容量。如果您观察到良好的进展,那么您将走上正确的道路,然后可以微调此方法。如果不是,请使用您的新发现编辑您的答案,并对此答案发表评论。

关于c++ - 在 C++ 中将大型文本文件快速读取为一维结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38291544/

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