首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速删除数百万个文件

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

Stack Overflow用户
提问于 2018-04-25 00:42:30
回答 4查看 1.4K关注 0票数 5

我们使用BOOST1.63 1.63 boost::filesystem::remove_all(dir_to_remove)删除包含数百万文件的文件夹(每个文件的大小为1MB)。文件夹"dir_to_remove“有子文件夹,每个子文件夹不超过1000个文件。删除所有文件需要10分钟以上。我们使用CentOS6.5。

在检查operations.cpp之后,我们实现了BOOST实际上使用Linux rmdir和unlink命令:

代码语言:javascript
复制
#   define BOOST_REMOVE_DIRECTORY(P)(::rmdir(P)== 0)
#   define BOOST_DELETE_FILE(P)(::unlink(P)== 0)

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-26 12:38:16

是的,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+树,有些基于叶名,它是不同的。但基本上,您希望避免过度的树再平衡,并避免对页名进行深度O(log N)查找,从而导致有序的断开链接。

票数 3
EN

Stack Overflow用户

发布于 2018-04-25 01:53:21

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

票数 8
EN

Stack Overflow用户

发布于 2018-04-25 07:54:59

您链接到的文章讨论了shell透视图。这一点非常重要: shell为许多任务启动程序。虽然启动一个程序非常便宜,但当你需要启动一百万个程序时,它可能会很昂贵。这就是为什么rsync如此有效的原因;一次调用就可以完成所有的工作。

同样的情况已经适用于您的程序。您只需启动一次程序,成本就是您正在制作的所有系统。

我检查了syscall列表;没有syscall允许您对一个syscall进行批量删除,因此您只能在每个文件中删除一个syscall。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50012507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档