快速文件解析C++

Fast file parsing C++

本文关键字:C++ 文件      更新时间:2023-10-16

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

在阅读了一些关于fread、ifstream等的基准测试(示例)后,我决定将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);

然后我会使用字符串流来解析如下文件:

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

并使用字符串流解析器继续解析。

我提出的问题都很简单:

  1. 上面的代码是将缓冲区复制到字符串流,还是共享同一个缓冲区?(我不太清楚pubsetbuf是做什么的,也不太清楚它的效率有多高)
  2. 有没有比使用字符串流更好的方法
  3. 当我们知道一些不相关信息的长度,即"不相关信息,重要信息",并且我们希望获得重要信息时,我们可以这样做:

    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不会复制。有关详细信息,请参阅以下链接:
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/

在文件中向前搜索要比读取其间的所有内容快得多。严格地说,它不需要更快,但在所有常见的操作系统上,它几乎是恒定的时间(不是真的,但与搜索长度无关)。如果只跳过一些字节,可能差异并不大,但距离越大,差异就越重要。

根据速度的重要性,
您的操作系统具有一些更快(但依赖于操作系统)的功能
是否有更好的解析方式取决于您的数据
你应该单独提问。