【发布时间】:2021-01-06 23:01:52
【问题描述】:
我有一个相对简单的问题要问,许多编程语言一直在讨论哪种方法可以提供最快的文件读取。主要讨论read() 或mmap()。作为一个也参与了这些辩论的人,我没有找到我当前问题的答案,因为大多数答案都有助于读取文件很大的情况(例如,如何读取 10 TB 的文本文件......) .
但我的问题有点不同,我有很多文件,比如说 1 亿个。我想从这些文件中读取前 1-2 行。文件是 10 kb 还是 100 TB 无关紧要。我只想要每个文件的前一两行。所以我想避免读取或缓冲文件中不必要的部分。我的知识不足以彻底测试哪种方法更快,或者首先发现我的所有选择。
我在做什么正确的知道:(我目前正在做这个多线程)
for(const auto& p: std::filesystem::recursive_directory_iterator(path)) {
if (!std::filesystem::is_directory(p)) {
std::ifstream read_file(p.path().string());
if (read_file.is_open()) {
while (getline(read_file, line)) {
// Get two lines here.
}
}
}
}
在这种情况下,C++ 或 linux 环境为我提供了什么?是否有更快或更有效的方法来读取数百万个文件的一小部分?
感谢您的宝贵时间。
信息:我可以访问C++20 和 Ubuntu 18.04
【问题讨论】:
-
你可以去掉
if (!std::filesystem::is_directory(p)) {并让ifstream构造函数失败,如果它是一个目录。这节省了fstat调用 -
@Jean-FrançoisFabre:
ifstream将愉快地“打开”一个目录.... -
不在我的机器上,它不在
-
ifstream 在开始时引入了过多的开销。就性能而言,您将无法超越智能使用
mmap。 -
解决这个问题的正确方法是在写入文件时对其进行索引。任何语言都无法“快速”访问数百万个文件。
标签: c++ c linux performance file