【问题标题】:c++ boost Get files from Disk in Parallelc++ boost 并行从磁盘获取文件
【发布时间】:2015-06-23 20:19:58
【问题描述】:

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

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

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

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

基本思路:

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

你觉得这个基本想法怎么样,听起来不错? 并行访问文件系统的 B+ 树有什么影响吗?

【问题讨论】:

  • 并行磁盘访问听起来比顺序读取文件要慢。
  • 进出硬盘的大部分数据都是串行的(即 SATA 接口)。那么,并行打开多个文件会有什么好处呢?

标签: c++ multithreading filesystems boost-filesystem


【解决方案1】:

目录扫描有两个常见的错误。您提出第二个(线程),可能是因为您正在遭受第一个的困扰。那就是进行深度优先搜索。目录在磁盘上非常连续。进行广度优先搜索利用了这一点。由于重复访问目录,执行深度优先搜索会导致扫描速度变慢。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 编辑到 50.000 个文件夹(错别字)
    猜你喜欢
    • 2021-03-29
    • 2015-03-21
    • 1970-01-01
    • 2018-10-16
    • 2020-07-08
    • 2020-10-17
    • 2011-04-14
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多