#unix #fs #multi-threading #walk-dir

nightly dirinventory

非常快速的多线程目录遍历

10 个版本 (6 个破坏性更新)

1.0.0-beta4 2022年1月12日
0.7.0 2022年1月22日
0.3.1 2021年12月31日

#1399 in 文件系统

MIT/Apache

255KB
1K SLoC

描述

此库实现了极快速多线程目录遍历的机制。使用多个线程利用内核调度 IO-请求的能力以最佳方式。

工作原理

用户创建一个 'Gatherer' 对象,该对象在 PriorityQueue 上启动线程。将 'directory' 发送到此队列让一个线程取走并遍历目录。找到的每个元素随后发送到一个自定义函数/闭包,该函数可以决定如何处理它

  • 目录可以再次发送到输入 PriorityQueue,其他线程可以取走。这会一直发生,直到输入队列耗尽,最终遍历初始发送的目录的所有子目录。
  • 文件和目录可以发送到输出 mcmp 队列,以便进一步处理。
  • 错误在发生时发送到输出队列。
  • 一旦输入队列变为空,就向输出发送 'Done' 消息,通知监听器。

队列

选择优先队列以确保目录按文件句柄保留的顺序处理。这是按 inode 顺序的深度优先。

内存优化

处理数百万个文件的路径名需要相当多的内存。为了节省内存,ObjectPath 实现通过其文件名及其父目录的引用对任何路径进行编码。此外,所有名称都进行了内部化,因此相同的名称只需要一次内存来存储。

基准测试结果

请参阅 'BENCH.md' 文件中的某些测试。基线是 'gnu find' 工具。在最极端的情况下,此代码可以执行目录遍历 20 倍更快。在慢速旋转磁盘和适度设置(16 个线程)下,1.6 倍更快。

依赖关系

~2–2.8MB
~58K SLoC