我正在尝试以分割负载的方式计算目录大小,以便用户可以看到计数进度。我认为这样做的逻辑方法是首先创建目录树,然后执行计算所有文件长度的操作。
我意想不到的是,大部分时间(磁盘I / O)来自创建目录树,然后几乎立即通过FileInfo[]
几乎没有磁盘I / O。
我尝试过两个Directory.GetDirectories()
,只是创建一个目录名字符串树,并使用DirectoryInfo
对象,这两种方法仍占用大部分I / O时间(与每个目录中的文件的所有FileInfo.Length
进行比较相比,读取MFT当然。
我想没有办法减少I / O使树显着,我想我只是想知道为什么这个操作比翻阅更多文件要花费更多的时间?
此外,如果有人可以推荐一种非递归的方式来计算一些东西(因为看起来我需要分开枚举并平衡它以使大小统计更具响应性)。为基础上的每个子目录创建一个线程并让调度程序竞争平衡可能不会很好,是吗?
答案 0 :(得分:4)
您可以使用Parallel.ForEach以并行方式运行目录大小计算。您可以获取GetDirectories并在每个节点上运行Parallel.ForEach。您可以使用变量来跟踪大小并将其显示给用户。每个并行计算将在同一变量上递增。如果需要,使用lock()在并行执行之间进行同步。