c++boost以并行方式从磁盘获取文件
c++ boost Get files from Disk in Parallel
我正在寻找一种快速的方法,从磁盘并行获取具有某些属性的文件列表。
属性:文件大小,绝对文件路径
目前,我正在使用boost文件系统和带有目录迭代器的递归调用。这对于小型数据集来说很好,但对于50000个文件夹中的一百万个文件来说就不太好了。
使用环境:操作系统:FreeBSD、Linux、Windows文件系统:ZFS、ext4、NTFS
基本理念:
- 线程池
- SubTreeWalker对象
- 在线程之间对根文件夹进行分区
- 如果存在惰性线程,subtreewalker会向线程池询问subdir中的每个新目录
- 如果4==true,则将目录分配给懒惰线程中的subtreewalker对象
你觉得这个基本想法怎么样,听起来合理吗?并行访问文件系统的B+树是否有任何影响?
目录扫描中有两个常见的错误。你提出第二个(线程),可能是因为你受到了第一个的影响。这是深度优先搜索。目录在磁盘上是非常连续的。进行广度优先搜索可以利用这一点。执行深度优先搜索会导致扫描速度减慢,因为目录会被重复访问。
这可能比线性搜索执行得更差,因为您将使用多个线程在磁盘上创建更多的随机访问读取。如果你想加快文件的处理速度(我认为你想对它们做点什么,而不仅仅是查看它们),我建议创建一个线程来扫描目录,将找到的文件排列在列表中,并使用一个或多个辅助线程逐个弹出队列中的文件并进行处理。这样可以节省完成扫描之前的等待时间。
如果可能的话,重新排列文件结构也可以加快处理速度。500000个目录中的一百万个文件听起来效率极低。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何获取有关Linux的磁盘信息
- 如何获取 UNIX 中进程的磁盘使用情况 (IO)
- 在C/C++中获取Linux中的磁盘标签
- 打开原始磁盘并获取OS X大小
- 获取物理磁盘路径
- Windows XP:如何从磁盘驱动器号获取USB设备位置
- 获取GPT磁盘上c++中特定分区的分区类型
- 在Linux c++应用程序中获取SCSI磁盘名称的方法
- Qt是否提供了一种获取空闲磁盘空间的方法?
- 如何在C/ c++中获取磁盘驱动器序列号?
- c++boost以并行方式从磁盘获取文件
- 获取磁盘示例代码的旋转速度
- 如何在linux上获取磁盘上的文件大小
- 获取一个FILE *句柄而不实际在磁盘上创建一个文件