如何并行迭代 directory_iterator?
How to iterate through a directory_iterator in parallel?
std::filesystem::directory_iterator
是一个 LegacyInputIterator
显然它不能并行使用 std::for_each
我可以遍历 directory_iterator
,获取项目,将它们放入向量中并使用该向量进行并行迭代。
上面的步骤可以省略吗?有没有办法像这样并行迭代 directory_iterator
:
std::for_each(
std::execution::par_unseq, // This is ignored currently
std::filesystem::begin(dir_it),
std::filesystem::end(dir_it),
func
);
directory_iterator
是一个输入迭代器,这意味着它在遍历过程中生成值。此外,对同一目录的多次遍历可能会产生不同的值序列(无论是顺序还是值本身),这意味着遍历不可重新启动。
对于并行算法,这意味着序列不能被分割,迭代必须在一个线程中按顺序发生。并行处理的唯一机会是将 func
执行卸载到单独的线程,这可能有效也可能无效。文件系统迭代是昂贵的,甚至可能比 func
中的处理更昂贵。在这种情况下,您可能会观察到 func
被顺序调用,当每个调用设法在迭代器增量完成之前完成时。
标准库实现是permitted忽略执行策略参数并串行执行算法。例如,如果输入序列无法分区,实现可能根本不会理会函数调用的并行化。
std::filesystem::directory_iterator
是一个 LegacyInputIterator
显然它不能并行使用 std::for_each
我可以遍历 directory_iterator
,获取项目,将它们放入向量中并使用该向量进行并行迭代。
上面的步骤可以省略吗?有没有办法像这样并行迭代 directory_iterator
:
std::for_each(
std::execution::par_unseq, // This is ignored currently
std::filesystem::begin(dir_it),
std::filesystem::end(dir_it),
func
);
directory_iterator
是一个输入迭代器,这意味着它在遍历过程中生成值。此外,对同一目录的多次遍历可能会产生不同的值序列(无论是顺序还是值本身),这意味着遍历不可重新启动。
对于并行算法,这意味着序列不能被分割,迭代必须在一个线程中按顺序发生。并行处理的唯一机会是将 func
执行卸载到单独的线程,这可能有效也可能无效。文件系统迭代是昂贵的,甚至可能比 func
中的处理更昂贵。在这种情况下,您可能会观察到 func
被顺序调用,当每个调用设法在迭代器增量完成之前完成时。
标准库实现是permitted忽略执行策略参数并串行执行算法。例如,如果输入序列无法分区,实现可能根本不会理会函数调用的并行化。