[英]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.