2013-07-10 66 views
0

我有一個程序,可將大量文件從多個目錄複製到目錄中。數額尚不清楚(約50K),但他們都在同一個驅動器。在程序中應該有一個進度條。當我第一次編寫程序時,我沒有寫進度條,程序運行緩慢。我約15-20分鐘傳遞文件。爲了編寫進度條我需要知道我有多少個文件,所以我瀏覽了目錄並列出了文件。現在第一次跑完文件大約需要5分鐘,但副本只需要5-7分鐘。一次傳遞後文件複製速度更快

任何人都可以解釋這種現象嗎?我很抱歉,我不能共享代碼,但它是一個簡單的使用File.Copy和一個簡單的C#.NET 3.5 progressBar

回答

4

這種方法可以減少最在磁盤驅動器上進行昂貴的操作,移動讀取頭。磁盤速度由兩個基本的機械限制來評定。一個是盤片的旋轉速度有多快,這在數據傳輸速度上設置了一個上限。這是固定的。讀頭可以多快移動到另一個軌道。尋找時間,通常是一個十幾毫秒的時間來移動一個軌道。 cpu週期很長。這使得您訪問磁盤數據非常重要的訂單。不斷地在目錄記錄和文件數據集羣之間來回讀取頭像你最初做的那樣非常昂貴。

在什麼程度上磁盤上的數據是碎片也是非常重要的,碎片整理工具存在的原因。看到創建和刪除文件的速度很快的驅動器往往會更快地被碎片化。碎片率越高,您需要從磁盤讀取數據的磁盤就越多。

通過首先閱讀目錄條目,可以避免很多搜索。它們被本地化在稱爲MFT的驅動器的一個區域中,彼此物理上彼此靠得很近,所以很少尋找長路徑。當您真正開始複製文件時,您會再次閱讀它們,但這次它們來自文件系統緩存。第一次掃描目錄時存儲在RAM中。所以不需要昂貴的尋找MFT。

另外值得一提的是,SSD的工作原理比機械驅動器好得多,它們的尋道時間非常短。

+0

絕對是我可以要求的最佳答案。 –