10 个版本 (6 个破坏性更新)
1.0.0-beta4 |
|
---|---|
0.7.0 | 2022年1月22日 |
0.3.1 | 2021年12月31日 |
#1399 in 文件系统
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