2012-06-26 35 views
7

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

我意想不到的是,大部分时间(磁盘I/O)来自于创建目录树,然后通过FileInfo[]几乎立即发生,几乎没有磁盘I/O。

我已经试过这两个Directory.GetDirectories(),只需要创建一个目录名的字符串的一棵树,并使用DirectoryInfo对象,这两种方法仍然需要的I/O的大部分时间(当然读的MFT)相比,检查每个目录中的文件的所有FileInfo.Length

我想没有办法减少I/O使树显着,我想我只是想知道为什么这个操作需要更多的时间比更多的文件?另外,如果任何人都可以推荐一种非递归方式来计算事物(因为看起来我需要将枚举分开并平衡它,以便使得大小的计算更具响应性)。为每个子目录创建一个线程并让调度程序竞争平衡事情可能不会很好,是吗?

编辑:Repository for this code

+0

我也在努力计算目录大小。我已经完成了你所做的。尝试> fileInfo []然后> Directory.GetDirectories()。但我仍然不知道有什么更好的办法。 –

+0

你是说调用GetDirectories()需要很长时间?我还没有看到,但是再一次,我从来没有这样做过大量的目录。另外,为什么你会关心它的递归?这是一个递归的任务,你永远不会有这么多的嵌套目录,你会吹堆栈。 –

+0

参考http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –

回答

4

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

+0

您应该对其进行编码,以便只有不相关的目录被并行化,并且没有理由超出该限制。虽然对于大多数磁盘,我不确定并行化会为您带来什么。磁盘IO本质上似乎是同步的。所有你可以真正并行的总和应该是可以忽略的实际增加 –

+2

你可以得到与SSD并行的IO ... –

+0

@JasonMalinowski真的......我不知道。大多数操作系统是否知道如何利用它?由于没有移动部件,我知道它快得多,不知道它是否也启用了并行。 –