我想在C++中查找文件系统中的重复文件。是否有任何算法可以尽可能快地完成此操作?我需要创建多线程应用程序吗,还是只需使用一个线程即可完成?
我想在C++中查找文件系统中的重复文件。是否有任何算法可以尽可能快地完成此操作?我需要创建多线程应用程序吗,还是只需使用一个线程即可完成?
我同意Kerrek SB的观点,认为有比C ++更好的工具来实现此操作,但是如果您确实需要使用C ++,在此提供一些建议和注意事项:
使用boost :: filesystem以实现可移植的文件系统遍历
针对每个文件进行散列处理是非常合理的建议,但是当具有重复大小的文件时,先制作一个多重映射可能会更有效。然后只在存在重复大小的文件时应用散列。
决定如何处理空文件和符号链接/快捷方式
决定如何处理特殊文件,例如在Unix上,您拥有目录FIFO,套接字等
考虑到文件或目录结构可能会在算法运行时发生更改、消失或移动
考虑到某些文件或目录可能无法访问或损坏(例如递归目录链接)
使线程数量可配置,因为合理的并行度取决于底层磁盘硬件和配置。如果您正在简单的硬盘上,它将与昂贵的SAN不同。不要做出假设;测试一下。例如,Linux非常擅长缓存文件,因此许多读取将来自内存,因此不会阻塞I / O。
1) 不要使用C++,所有需要的工具已经存在。
2) 对每个文件进行哈希(例如使用md5sum
),并建立一个包含文件名、文件大小和哈希值的索引*。
3) 按照哈希值排序,并查找哈希值和大小相同的重复对(例如使用sort
)。
4) 对候选的重复项执行普通的diff
操作。
你可以通过一些工作来并行化步骤2),但是你将受到存储的I/O速度的限制。你可以通过将大型索引文件分成多个部分,分别排序,然后合并它们(sort -m
)来并行化步骤3)。
*) 正如@frankc所说,不要实际上哈希每个文件,而仅哈希那些大小不唯一的文件。从基于大小的索引开始。你将不得不哈希很多小文件,但只有极少数的大文件。