c++boost以并行方式从磁盘获取文件

c++ boost Get files from Disk in Parallel

本文关键字:磁盘 获取 文件 方式 并行 c++boost      更新时间:2023-10-16

我正在寻找一种快速的方法,从磁盘并行获取具有某些属性的文件列表。

属性:文件大小,绝对文件路径

目前,我正在使用boost文件系统和带有目录迭代器的递归调用。这对于小型数据集来说很好,但对于50000个文件夹中的一百万个文件来说就不太好了。

使用环境:操作系统:FreeBSD、Linux、Windows文件系统:ZFS、ext4、NTFS

基本理念:

  1. 线程池
  2. SubTreeWalker对象
  3. 在线程之间对根文件夹进行分区
  4. 如果存在惰性线程,subtreewalker会向线程池询问subdir中的每个新目录
  5. 如果4==true,则将目录分配给懒惰线程中的subtreewalker对象

你觉得这个基本想法怎么样,听起来合理吗?并行访问文件系统的B+树是否有任何影响?

目录扫描中有两个常见的错误。你提出第二个(线程),可能是因为你受到了第一个的影响。这是深度优先搜索。目录在磁盘上是非常连续的。进行广度优先搜索可以利用这一点。执行深度优先搜索会导致扫描速度减慢,因为目录会被重复访问。

这可能比线性搜索执行得更差,因为您将使用多个线程在磁盘上创建更多的随机访问读取。如果你想加快文件的处理速度(我认为你想对它们做点什么,而不仅仅是查看它们),我建议创建一个线程来扫描目录,将找到的文件排列在列表中,并使用一个或多个辅助线程逐个弹出队列中的文件并进行处理。这样可以节省完成扫描之前的等待时间。

如果可能的话,重新排列文件结构也可以加快处理速度。500000个目录中的一百万个文件听起来效率极低。