c++ - 导致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]);
}
}
解决方案
string.append
不是最快的。它会导致内存重新分配。你可以这样做:
- 从末尾开始搜索 0,然后 peekg,以获取文件长度。
- 创建一个字符串并将其调整为所需的长度。
- 在一个循环中,直接读入你的字符串,按 64k 块(甚至一次读取整个文件)。
推荐阅读
- c++ - 简单格斗游戏的代码,但在玩家健康变为 0 后游戏继续循环
- cmake - Cmake --config 自版本 3.20
- python - ValueError:发送str时,必须是十六进制字符串。得到:“'0x6e...32'”
- python - Python - 将坐标映射到直线和圆弧列表中
- reactjs - 如何通过用户输入绘制折线图?
- firebase - 我想创建一个 Jenkins cron 作业
- c++ - C++ 布尔行为与预期不符
- python - Choosing Elements from numpy
- c# - 配对:随机选择两个团队并随机选择获胜者
- python - Pandas Python (CSV) - 从表中访问数据并使用该数据 -