【问题标题】:Microsoft PPL parallel_for_each with boost filesystem directory_iterator带有 boost 文件系统 directory_iterator 的 Microsoft PPL parallel_for_each
【发布时间】:2011-09-07 19:19:42
【问题描述】:

使用 Visual Studio 2010 SP1

所以我有一个 std::for_each 使用 boost::filesystem 库对大量文件进行迭代。 因为这些迭代不会相互混淆,所以我试图让多线程处理它,所以我尝试使用 VS 2010 库 PPL。

旧:for_each(directory_iterator(path), directory_iterator(), <lambda function>); 新:parallel_for_each(directory_iterator(path), directory_iterator(), <lambda function>);

问题是,parallel_for_each 没有编译,因为它要求随机访问迭代器或前向访问迭代器,我假设 directory_iterator 不是。 有没有办法让 directory_iterator 在这种情况下工作?也许有一个我不知道的不同迭代器,或者某种类型的演员?

尝试在网络上搜索答案,但 PPL 与 boost 的讨论还没有那么多。

提前致谢。

【问题讨论】:

  • 一种解决方法是遍历所有目录并将它们添加到支持随机访问迭代器的容器中。然后您可以在新容器上使用 parallel_for_each。
  • "它要求随机访问迭代器或前向访问迭代器,我认为 directory_iterator 不是" 正确 -- directory_iteratorsingle pass iterator
  • 感谢您的提示。 Fox32:现在我因为没有想到这一点而感到愚蠢.. 用一些不干净的代码尝试了它,它工作了,不仅如此,我还通过添加几行代码赢得了很多性能。再次感谢:)

标签: c++ visual-studio-2010 boost c++11


【解决方案1】:

如果您的大部分时间都花在加载文件上,那么您尝试加载多个文件只会拖慢自己的速度。也就是说,如果你的工作是处理绑定的,你可以这样做:

for each file // serial
{
    load file into memory
    spawn task to process file // concurrent
}

wait until tasks to complete

为此,您需要使用tasks

【讨论】:

  • 感谢您的意见。实际上我正在并行加载文件,这是一个可怕的想法,但代码仍然很脏。有趣的是,即使并行加载文件(不仅仅是并行处理它们),程序的性能也比串行版本好得多。现在我要按照你的例子尝试任务,看看它是如何进行的,如果将来有人想知道,我会报告我的发现。再次感谢。
  • @sap:我自己也想知道结果。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多