首页 > 解决方案 > 导致c++程序运行缓慢的文件系统

问题描述

我正在从本地系统(Ubuntu 20.04)读取 100 万个文件,每个文件大约 10KB。前 40000 个文件的处理速度非常快,接下来的 960000 个文件的处理速度要慢得多。我假设这与操作系统/硬件/文件系统功能有关。我基本上是在执行一个文件,如下所示:

string read_file(std::ifstream& ifs) {
     vector<char> buf(64 * 1024);
     string s = "";
     ifs.read(&buf[0], buf.size());
     while (int n = ifs.gcount()) { s.append(&buf[0], n); ifs.read(&buf[0], buf.size()); }
     return s;
}

有人可以解释导致速度变慢的原因以及如何解决吗?

编辑:我正在处理函数中的字符串,我不确定它们在执行后是否仍然存在:

 void process_file(string file_name) {
      ifstream ifs(file_name);
      string s = read_file(ifs);
      process_data(s);
 }

 void p1() {
      vector<string> files = get_files(); // 1 million size vector of filenames
      for (int i = 0 ; i < files.size(); i++) {
           process_file(files[i]);
      }
 }

process_data 写入另一个文件但不保留字符串

编辑:我已经注释掉了process_data(s)函数并通过file_name引用传递了,并且得到了相同的行为。但是,如果我将程序运行到 N,ctrl C,然后重新运行,前 N 个文件加载速度非常快。

 void process_file(string& file_name) {
      ifstream ifs(file_name);
      string s = read_file(ifs);
      // process_data(s);
 }

 void p1() {
      vector<string> files = get_files(); // 1 million size vector of filenames
      for (int i = 0 ; i < files.size(); i++) {
           process_file(files[i]);
      }
 } 

标签: c++

解决方案


string.append不是最快的。它会导致内存重新分配。你可以这样做:

  • 从末尾开始搜索 0,然后 peekg,以获取文件长度。
  • 创建一个字符串并将其调整为所需的长度。
  • 在一个循环中,直接读入你的字符串,按 64k 块(甚至一次读取整个文件)。

推荐阅读