我需要为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分钟才能完成上述代码。 我认为我需要一些帮助以获得更好的方法。请帮助我多多谢谢
答案 0 :(得分:0)
因此,由于它在大约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
答案 1 :(得分:0)
将文件复制到本地计算机需要多长时间?如果耗时2.5小时,那就没有效率低,除了尝试在远程机器上运行代码之外,你无能为力。
如果副本花费的时间少于2.5小时,那么您就知道过程中的某些地方效率低下 - 例如,缓冲区太小或者数据被重复提取。如果是这种情况,最简单的解决方案是将每个文件复制到本地临时目录,然后执行校验和。如果您希望它尽可能快地运行,请使用复制文件的线程和计算校验和的一个或多个线程,这样您就不必在复制下一个文件之前等待校验和完成。