7

我试图以一种划分负载的方式计算目录大小,以便用户可以看到计数进度。我认为这样做的合乎逻辑的方法是首先创建目录树,然后执行计算所有文件长度的操作。

出乎我意料的是,大部分时间(磁盘 I/O)来自创建目录树,然后FileInfo[]几乎立即完成,几乎没有磁盘 I/O。

我已经尝试过两种方法Directory.GetDirectories(),只需创建目录名称的字符串树,并使用一个DirectoryInfo对象,与遍历所有FileInfo.Lengthfor每个目录中的文件。

我想没有办法显着减少 I/O 来制作树,我想我只是想知道为什么这个操作比遍历更多的文件需要更多的时间?

此外,如果有人可以推荐一种非递归的方式来计算事物(因为似乎我需要拆分枚举并平衡它以使大小计算更具响应性)。为每个子目录创建一个线程并让调度程序竞争平衡事情可能不是很好,不是吗?

编辑: 此代码的存储库

4

1 回答 1

4

您可以利用Parallel.ForEach以并行方式运行目录大小计算。您可以获取 GetDirectories 并在每个节点上运行 Parallel.ForEach。您可以使用变量来跟踪大小并将其显示给用户。每个并行计算将在同一变量上递增。如果需要,请使用 lock() 在并行执行之间进行同步。

于 2012-06-26T17:59:32.593 回答