2012-06-26 118 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真的......我不知道。大多數操作系統是否知道如何利用它?由於沒有移動部件,我知道它快得多,不知道它是否也啓用了並行。 –