如何快速删除数百万个文件

How to quickly delete millions of files

本文关键字:百万个 文件 数百万 删除 何快速      更新时间:2023-10-16

我们使用boost1.63 boost::filesystem::remove_all(dir_to_remove)删除具有数百万个文件的文件夹(每个文件的大小为1MB(。文件夹" dir_to_remove"具有子文件夹,每个子文件夹的文件不超过1000个文件。删除所有文件需要超过10分钟的时间。我们使用Centos6.5。

检查了operations.cpp后,我们意识到BOOST实际使用Linux rmdirunlink命令:

#   define BOOST_REMOVE_DIRECTORY(P)(::rmdir(P)== 0)
#   define BOOST_DELETE_FILE(P)(::unlink(P)== 0)

本文列出了几种在Linux上更有效删除文件的方法。并建议使用rsync

如何使用C 快速删除数百万个文件?

如果要免费获得所需的位置,则最快的方法是移动(或重命名(目录到同一分区上的另一个位置。然后,您的程序可以继续使用所需的位置工作,并在另一个线程(在后台(中递归递归移动的目录。此线程甚至可以减少优先级,因此删除特定目录看起来像即时文件系统操作。

是的, std::filesystem::directory_iterator非常容易。我希望在即将到来的P1031低级文件I/O中完全替换该设施(请注意,直到2018年6月才能在WG21上进行实时(,并且可以很好地输入,因此我们正在使用。

同时,我建议您使用https://ned14.github.io/afio/,这是P1031的参考实现,特别是directory_handle::enumerate()。该图书馆可以轻松处理数百万甚至数千万文件的目录。删除条目列表后,您需要遵循B 树友好的删除模式,即将它们对字母顺序排序或inode顺序进行分类,然后执行以下操作:

之一
  1. 从第一个条目开始的UNINK。
  2. 从最后一个条目向后链接。
  3. 从第一个条目开始,然后是最后一个条目,向中心移动。

我将为您的特定归档系统进行所有六种方法,然后选择最快的方法。有些使用基于Inode编号的B 树,有些基于叶名,它会有所不同。但基本上,您想避免过度平衡树,并避免使用叶名的深度O(log n(查找,因此订购的Unin链路。

您链接到有关壳透视的文章。这至关重要:外壳启动了许多任务的程序。而且,在启动程序非常便宜的同时,当您需要启动一百万个程序时,它可能会很昂贵。这就是rsync如此有效的原因;单个调用可以完成所有工作。

同样的已经适用于您的程序。您一次启动程序;成本只是您要制作的所有Syscall。

我检查了Syscall列表;没有SYSCALL可以让您使用一个Syscall进行大量删除

根据存储体系结构,您可以通过并行删除文件来加速。因此,将工作分配在std::thread s之间,或者如果您想快速尝试,请使用OpenMP Pragma。

这就是我管理〜200 TB储物盒的方式。

请注意,如果任何文件链接在一起,则可能有轻微的种族条件,但是只要您处理错误,就可以了。