C# 文件IO重复检查是否更有效?
基本上我有这个应用程序,它扫描文件夹中的所有mp3,并返回一个没有重复文件的文件列表。我有两种方法来执行此任务。第一个删除重复的文件名,第二个删除具有匹配mp3 IDv3标记的重复文件 然而,我的文件夹有大约5000个文件,它成功地删除了类似4900的重复文件,但这需要永远!有人能提出一个更有效的方法吗?我使用并行性使事情尽可能快,但它仍然很慢 删除重复文件名的第一种方法:C# 文件IO重复检查是否更有效?,c#,file,io,mp3,parallel-processing,C#,File,Io,Mp3,Parallel Processing,基本上我有这个应用程序,它扫描文件夹中的所有mp3,并返回一个没有重复文件的文件列表。我有两种方法来执行此任务。第一个删除重复的文件名,第二个删除具有匹配mp3 IDv3标记的重复文件 然而,我的文件夹有大约5000个文件,它成功地删除了类似4900的重复文件,但这需要永远!有人能提出一个更有效的方法吗?我使用并行性使事情尽可能快,但它仍然很慢 删除重复文件名的第一种方法: private static IEnumerable<string> GetFilesFromDir(stri
private static IEnumerable<string> GetFilesFromDir(string dir)
{
return Directory.GetFiles(dir, "*.mp3", SearchOption.AllDirectories).Distinct();
}
调用
Distinct()
在这里似乎毫无意义Directory.GetFiles()
返回完整的文件名(带路径),因此它们总是不同的。分析现有的解决方案。例如,如果瓶颈在I/O中,那么巧妙地使用这种“外部”代码可能没有多大帮助。另外,使用Parallel.ForEach
版本的计算机上的CPU使用率是多少?双核和四核计算机上的CPU使用率非常低(约1-8%)。我不知道为什么要使用Parallel.ForEach。ConcurrentDictionary无论如何都是同步的,因此您不会分配太多的处理。“CPU使用率非常低(约1-8%)”-这是一个强烈的迹象,表明这是I/O限制。请使用探查器确认。假设它是I/O绑定的,在不更改硬件的情况下,我可能无法加快速度?ArtistTitleAlbumString需要是不同的,而不是文件名/路径。我同意删除distinct()部分。有道理,但不知道我为什么把它放在第一位。
private static IEnumerable<string> RemoveDuplicates(IEnumerable<string> files)
{
var dictionary = new ConcurrentDictionary<string, string>();
Parallel.ForEach(files, f =>
{
string tag = SongInformation.ArtistTitleAlbumString(f);
dictionary.TryAdd(tag, f);
});
return dictionary.Values;
}
var newFiles = RemoveDuplicates(GetFilesFromDir(Settings.SharedFolder));