快速文件解析 C++

Fast file parsing C++

我目前正在做一个项目,我必须读取几个大文件。我想问一下在C++中优化文件解析的一些最佳实践

在阅读了有关 fread、ifstream 等的一些基准测试 (example) 之后。我决定为此目的使用 ifstream(如果您认为有更好的方法,请指出任何改进之处)。到目前为止我使用它的方式是这样的:

  std::ifstream input_file ("some_file.txt");
  input_file.seekg (0, input_file.end);
  int length = input_file.tellg();       // Get the size of the buffer 
  input_file.seekg (0, input_file.beg);

  std::vector<char> buffer (length);
  input_file.read(&buffer[0], length);

然后我会像这样使用 stringstream 来解析文件:

  std::stringstream parser;
  parser.rdbuf()->pubsetbuf(&buffer[0], length);

并继续使用 stringstream 解析器进行解析。

我的问题如下:

  1. 以上代码是将缓冲区复制到stringstream还是共享同一个缓冲区? (我不太清楚 pubsetbuf 的作用或效率如何)
  2. 有没有比使用 stringstream 更好的方法来做到这一点?
  3. 当我们知道一些无关信息的长度,即"irrelevant information, important information",我们希望得到重要的信息,我们可以这样做:

    std::string container; 
    parser.seekg(irrelevant_size, parser.cur); // irrelevant_size is the size 
                                               // of irrelevant data
    std::getline(parser, container);
    
  4. 相比,这样做的效率如何

    parser.get(temp_char_array, irrelevant_size + 1);

    收集所有不相关的数据?

pubsetbuf 不会复制。有关详细信息,请参阅以下 link:
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/

在文件中向前查找比读取文件之间的所有内容快(多)。严格来说,它不需要更快,但在所有通常的 OS 上,它几乎是恒定的时间(不是真的,但无论如何都与搜索长度不成比例)。如果只跳过一些字节,差异可能不会那么大,但距离越大,差异就越大。

取决于速度的重要性,
你的 OS 有一些更快的(但 OS 依赖)功能。
至于有没有更好的解析方式就看你的数据了。
你应该在单独的问题中提出这个问题。