任务并行库用于目录遍历

6
我想遍历硬盘上的目录,并搜索所有文件以查找特定的搜索字符串。这听起来像是一个很适合并行处理的任务,因为IO速度相对较慢。
传统上,我会编写一个递归函数来查找和处理当前目录中的所有文件,然后递归到该目录中的所有目录中。我想知道如何修改这个函数以实现更好的并行处理。首先,我只是修改了:
foreach (string directory in directories) { ... }

to

Parallel.ForEach(directories, (directory) => { ... }) 

但我觉得这样可能会创建太多的任务并陷入混乱,特别是当尝试将其调度回UI线程时。我还觉得任务数量是不可预测的,这可能不是并行化此任务的有效方式。
有人以前成功地做过这样的事吗?你在这样做时有什么建议?

+1 我很高兴Jon驳斥了这个理论,因为我也认为这是一个不错的选择。似乎微软自己也无法正确地执行它:http://msdn.microsoft.com/en-us/library/ff477033.aspx -> 在底部阅读评论 :) - Jeremy Thompson
1个回答

15

不,这个内容不适合并行处理,因为IO速度较慢。你的计算将受到磁盘限制。假设你只有一块硬盘,你不希望它同时寻址多个不同的位置。

这有点像试图将几个水管连接到同一个水龙头以便更快地获取水流 - 或者尝试在单个核心上运行16个CPU密集型线程:)


这是有道理的。那么,让一个线程处理所有的磁盘IO,而其他多个线程解析文件会更有益吗? - rein
3
如果解析数据需要很长时间,那么将其与同步读取分开可能是有意义的。但是,如果IO是最显著的瓶颈,这样做实际上可能不会带来太多收益,并使代码变得复杂。您可以考虑让一个线程执行同步IO并将数据传递给另一个线程进行解析。值得尝试。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接