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

wer*_*erk 6 c++ boost

我们使用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)
Run Code Online (Sandbox Code Playgroud)

文章列出的几种方法在Linux上更有效地删除文件.它建议使用rsync.

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

S.M*_*.M. 7

如果要释放所需位置,最快的方法是将目录移动(或重命名)到同一分区上的另一个位置.然后,您的程序可以继续使用所需的位置,并在另一个线程(在后台)递归删除以前移动的目录.该线程甚至可以以较低的优先级工作,因此删除特定目录看起来就像是即时文件系统操作.


Nia*_*las 3

是的,std::filesystem::directory_iterator很无聊。我希望在即将推出的P1031 低级文件 I/O中完全替换该设施(注意要到 2018 年 6 月才会在 WG21 上上线),并使用能够很好地扩展输入的东西,所以我们正在努力。

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

  1. 取消与第一个条目的链接。
  2. 从最后一个条目向后取消链接。
  3. 从第一个条目取消链接,然后是最后一个条目,向中心移动。

我会针对您的特定文件系统对所有六种方法进行基准测试,然后选择最快的方法。有些使用基于inode编号的B+树,有些基于leafname,它有所不同。但基本上,您希望避免过度的树重新平衡,并避免对叶名进行深度 O(log N) 查找,从而避免有序取消链接。