c++ - 遍历文件系统的最快方法

标签 c++ linux file filesystems hard-drive

有时我需要递归遍历一个文件夹,读取其中所有文件的内容。

我使用 C++ 和 Linux。

文件夹内容是任意的,从十亿个小文件到十几个庞大的文件。

为了达到最高的阅读速度,我陷入了进退两难的境地。 一方面,从一个线程执行所有读取几乎总是更快,因为对文件系统的并行访问会导致并发读取文件之间的头部抖动: enter image description here

另一方面,出于两个原因,从一个线程顺序访问文件系统并没有达到预期的速度。

首先,前一个读取请求完成和下一个读取请求启动之间花费的时间丢失了。除了阅读本身之外,我在阅读线程中几乎什么都不做,我试图尽可能地减少它,但是在用户空间和内核空间之间不断切换它仍然是一些时间损失,特别是在上述情况下数十亿个小文件。 enter image description here

其次,单线程读取不允许内核和/或 HDD Controller 对请求的扇区执行一些重新排序,这可以提高性能。

所以,我想实现两件事:

1) 例如LibUsb,我可以有几个待处理的读取请求,这些请求按顺序处理但是在上一个请求完成和下一个请求启动之间没有暂停。是否有可能获得类似的东西用于 FS 访问?

enter image description here

2)是否可以同时向内核提交多个读请求,但是用某种方式标记它们,让内核知道这些请求没有个别 截止日期,并且应该最小化它们累积执行的汇总时间

enter image description here

最佳答案

由于您使用的是 Linux,也许您应该提供新的 io_uring界面一试。它声称比传统的同步(线程池+阻塞 sycalls)或异步 libaio 方法更高效、性能更好。

对于 1,io_uringIORING_SETUP_SQPOLL 标志似乎可以满足您的需求,只要您不断发送请求即可。

关于c++ - 遍历文件系统的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61061049/

相关文章:

mysql - C 中的存储过程 - 输出参数的问题。我该如何使用字符串?

javascript - 将文件传递到 Controller 而不使用表单,

c++ - ostream 必须只接受一个参数

c++ - 使用具有相同参数的不同模板模板参数重载函数时出错

c++ - 如何将对象添加到另一个类中的 vector<object> ?

c++ - 解决在 C++ 中调用具有相同名称的函数的方法中的冲突

Linux进程内存方案

linux - Ubuntu中为什么使用软链接(soft link)?

c++ - 作为文件名路径的第一个参数是什么意思?

c++ - D3DXERR_INVALIDDATA 发生