Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件IO重复检查是否更有效?_C#_File_Io_Mp3_Parallel Processing - Fatal编程技术网

C# 文件IO重复检查是否更有效?

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

基本上我有这个应用程序,它扫描文件夹中的所有mp3,并返回一个没有重复文件的文件列表。我有两种方法来执行此任务。第一个删除重复的文件名,第二个删除具有匹配mp3 IDv3标记的重复文件

然而,我的文件夹有大约5000个文件,它成功地删除了类似4900的重复文件,但这需要永远!有人能提出一个更有效的方法吗?我使用并行性使事情尽可能快,但它仍然很慢

删除重复文件名的第一种方法:

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));