Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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+;中查找重复文件的最佳方法是什么+;? 我想在C++文件系统中找到重复的文件。是否有任何算法可以尽可能快地做到这一点?我需要创建一个多线程应用程序,或者我可以用一个线程来完成它? < P > 1)不要使用C++。您需要的所有工具都已经存在_C++_Algorithm_File - Fatal编程技术网

在C+;中查找重复文件的最佳方法是什么+;? 我想在C++文件系统中找到重复的文件。是否有任何算法可以尽可能快地做到这一点?我需要创建一个多线程应用程序,或者我可以用一个线程来完成它? < P > 1)不要使用C++。您需要的所有工具都已经存在

在C+;中查找重复文件的最佳方法是什么+;? 我想在C++文件系统中找到重复的文件。是否有任何算法可以尽可能快地做到这一点?我需要创建一个多线程应用程序,或者我可以用一个线程来完成它? < P > 1)不要使用C++。您需要的所有工具都已经存在,c++,algorithm,file,C++,Algorithm,File,2) 散列每个文件(例如,使用md5sum),并建立文件名、文件大小和散列值的索引* 3) 按哈希值排序,并查找哈希值和大小的重复对(例如,使用排序) 4) 对候选副本执行普通的diff 您可以通过一些工作来并行化步骤2),但会受到存储器I/O速度的限制。您可以将大型索引文件拆分为若干位,分别对它们进行排序,然后合并它们(sort-m) *)正如@frankc所说,实际上并不是对每个文件都进行散列,而是只对大小不唯一的文件进行散列。从基于大小的索引开始。你必须散列很多小文件,但只有很少几个大文件

2) 散列每个文件(例如,使用
md5sum
),并建立文件名、文件大小和散列值的索引*

3) 按哈希值排序,并查找哈希值和大小的重复对(例如,使用
排序

4) 对候选副本执行普通的
diff

您可以通过一些工作来并行化步骤2),但会受到存储器I/O速度的限制。您可以将大型索引文件拆分为若干位,分别对它们进行排序,然后合并它们(
sort-m

*)正如@frankc所说,实际上并不是对每个文件都进行散列,而是只对大小不唯一的文件进行散列。从基于大小的索引开始。你必须散列很多小文件,但只有很少几个大文件。

我会这样做:

  • 扫描你感兴趣的目录,查看每个文件的大小;将成对的文件大小/路径存储在
    多映射中
    ,文件大小作为索引
  • 然后,扫描
    multimap
    ,查找每个键只有一个元素的bucket,即大小唯一的文件;这些肯定不能重复
  • 散列其余文件的内容,并执行与以前相同的操作(
    multimap
    ,散列作为键,路径作为值)
  • 然后仅对具有相同哈希的文件执行实(字节/字节)比较
这个过程应该比盲目地散列所有文件要快得多,因为大多数文件都有不同的大小,只要看一下就可以分辨出来;检查文件大小比散列文件便宜得多,因为它只是文件系统属性查找,而不是读取文件的全部内容

最后一步是必要的,因为有可能不同的文件具有相同的哈希;但是使用好的散列函数,大部分工作已经完成,因为不相关文件的散列冲突应该非常少

请注意,哈希函数不需要加密安全,也不需要特别快(我想这个过程的时间将由IO控制)


此外,由于您实际上不需要有一个已排序的容器,因此可以使用
unordered_multimap
,而不是
multimap
,因为它应该有更快的查找时间,并且一旦您知道需要处理多少文件,您可以使用确定的最大元素数调用
reserve
,我不同意Kerrek SB,我认为,有比C++更有效的工具,但是,假设你真的需要在C++中这样做,这里有一些建议和要在你的实现中考虑的事情:

  • 使用boost::filesystem进行可移植的文件系统遍历

  • hash every file建议是非常合理的,但是首先制作一个以文件大小为关键的多重映射可能更有效。然后仅当存在重复大小的文件时应用哈希

  • 决定如何处理空文件和符号链接/快捷方式

  • 决定如何处理特殊文件,例如在unix上有目录、FIFO、套接字等

  • 说明在算法运行时,文件或目录结构可能会更改、消失或移动

  • 说明某些文件或目录可能无法访问或损坏(例如递归目录链接)

  • 使线程的数量可配置为合理的并行化量,这取决于底层磁盘硬件和配置。如果您使用的是简单的硬盘驱动器,而不是昂贵的san,则情况会有所不同。不过,不要做假设;测试一下。例如,Linux非常擅长缓存文件,因此许多读取都来自内存,因此不会阻塞i/o


  • 通常只有一个线程执行IO,因为HDD不能同时访问磁盘(不确定SSD)。要找到重复项,请比较散列,通常是MD5或SHA1。相关问题:您能再详细说明一下吗?是否要搜索整个磁盘,以查看任何目录中的任何文件是否与驱动器上的任何其他文件重复?是否需要文件系统访问、算法或两者的帮助?是否要搜索整个磁盘,以查看任何目录中的任何文件是否与驱动器上的任何其他文件重复?对的您需要文件系统访问、算法或两者的帮助吗?我需要算法方面的帮助,但如果您能帮助我访问文件系统,我将不胜感激:)我不想使用它,但它是任务的一部分;)。所以我需要一个单线程,对吗?不确定第2步如何并行。大部分时间都花在IO上。顺便问一下,我可以散列非文本文件(例如*.avi或*.mp3)吗?“按排序”ehmm。。。只需通过哈希值(或哈希值+文件大小)(例如:列表字典)进行索引,这样就不必排序。正如@frankc所说,您可能应该首先对文件大小进行索引,并且只计算这些候选文件的哈希值。+1-首先按文件大小进行绝对是更好的方法!通过OpenSSL库查找文件哈希的最佳方法是什么?查找文件哈希的功能可以应用于所有文件还是仅应用于txt文件?是的,这可能很好。您可以在这里看到如何计算MD5SUMMS:此应用程序不需要加密安全的哈希,除非有人故意愚弄您的扫描仪会导致安全问题(如自动删除重复项等)