【问题标题】:Quickly parse tab-separated strings and ints in c++在 c++ 中快速解析制表符分隔的字符串和整数
【发布时间】:2016-08-27 19:20:11
【问题描述】:

我有一个几千兆字节的文件,有数百万行。每行都有这样的数据分隔:

string TAB int TAB int TAB int NEWLINE

由于 CPU 而不是我的 SSD 的写入速度,我之前逐行读取此内容的尝试遇到了瓶颈。

如何快速逐行解析海量文件?

注意:文件太大,不能一次性全部解析成向量。

在我的原始代码中,我将数据解析成这样的结构向量

struct datastruct {
    std::string name;
    int year;
    int occurences;
    int volcount;
};
std::vector<datastruct> data;

【问题讨论】:

  • 你想把它解析成什么?
  • @flatmouse 在我的测试中,我使用的是结构向量
  • @flatmouse 查看我的编辑
  • 您想要获得的最终结果是什么?文件验证?输出到别的东西?
  • @flatmouse 我正在对数据进行一些统计分析,我已经计算过了。我遇到的问题是快速解析数据。

标签: c++ parsing optimization io bigdata


【解决方案1】:

使用您的datastruct,您可以这样做

std::ifstream file;
datastruct data;
while (file >> data.name >> data.year >> data.occurences >> data.volcount)
{
    // do what you want with data, its contents will be replaced during next iteration
}

有那么慢吗?

【讨论】:

  • @FelisPhasma 我认为该文件对于vector来说太大了?
  • @flatmouse 正确。逐行方法更好,因为它不会将整个文件复制到内存中。
  • @FelisPhasma 这甚至不在线操作。即使您的文件位于单行上,它仍会逐个元素地读取它(显然,istream 使用某种内部缓冲区,因此某些内容将在 ram 中)
  • 这是当前表单中问题的一个很好的答案。它不假设解析后数据会发生什么。
  • @flatmouse 虽然只是一个问题,但它没有概述它对数据的作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2015-05-24
  • 2012-12-25
相关资源
最近更新 更多