【问题标题】:fast calculate MD5 for files in unc path快速计算 unc 路径中文件的 MD5
【发布时间】:2017-08-28 02:40:56
【问题描述】:

我需要为 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 分钟。 我想我需要一些帮助才能获得更好的方法。请帮助我,非常感谢

【问题讨论】:

标签: c# md5


【解决方案1】:

因此,由于它在本地运行大约需要 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】:

    将文件复制到本地计算机需要多长时间?如果花了 2.5 小时,那么就没有效率低下,除了尝试在远程机器上运行代码之外,您无能为力。

    如果复制所用时间少于 2.5 小时,那么您就知道该过程的某处效率低下 - 例如,缓冲区太小或重复获取数据。如果是这种情况,最简单的解决方案是将每个文件复制到本地临时目录,然后进行校验和。如果您希望它尽快运行,请使用一个复制文件的线程和一个或多个计算校验和的线程,这样您就不必在复制下一个文件之前等待校验和完成。

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多