簡體   English   中英

快速計算unc路徑中文件的MD5

[英]fast calculate MD5 for files in unc path

我需要為UNC文件夾(\\\\ 192.168.1.3 \\ ABC)中的每個文件計算md5。 問題在於此文件夾包含大量文件(〜2000個文件),下面的代碼需要我2.5個小時才能完成。

 foreach (var file in filesInFolder)
 {
    using (var md5 = MD5.Create())
     {
       using (var stream = File.OpenRead(file))
        {
           var md5Check = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "‌​").ToLower();
           dicMD5[file] =md5Check;
        }
     }
 }

如果ABC是本地文件夾,則大約需要5分鍾才能完成上面的代碼。 我認為我需要一些幫助以尋求更好的方法。 請幫我多謝

因此,由於它在本地運行約5分鍾,因此問題可能與通過網絡讀取文件有關。 加快速度的最佳方法是將程序放在文件所在的本地,並在需要時將結果傳達給另一台計算機。 我意識到有些時候這是行不通的,因此限制了您的工作能力。

但是,您可以做的一件事就是調用讀取所有文件的多線程。

var maxThreads = 8;

Parallel.ForEach(filesInFolder, new ParallelOptions { MaxDegreeOfParallelism = maxThreads }, file => { 
    using (var md5 = MD5.Create()) {
        using (var stream = File.OpenRead(file)) {
            var md5Check = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "‌​").ToLower();
            dicMD5[file] = md5Check;
        }
    }
});            

這將並行運行所有操作,受maxThreads變量限制。

我使用此代碼僅在2分鍾內計算了17k文件的哈希值。 因此,盡管這在網絡上可能仍然較慢,但它應該比您當前正在執行的速度快得多。 只要確保將maxThreads設置為適合您計算機的值即可。

注意:您可能希望將dicMD5 ConcurrentDictionary 在這里找到System.Collections.Concurrent

將文件復制到本地計算機需要多長時間? 如果花了2.5個小時,那么就不會造成效率低下,除了嘗試在遠程計算機上運行代碼之外,您無能為力。

如果復制花費的時間少於2.5小時,那么您就會知道該過程中的某個地方效率低下-例如,緩沖區太小或重復獲取數據。 如果是這樣,最簡單的解決方案是將每個文件復制到本地臨時目錄,然后執行校驗和。 如果要使其盡快運行,請使用一個復制文件的線程和一個或多個計算校驗和的線程,因此您不必在復制下一個文件之前等待校驗和完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM