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

前端之家收集整理的这篇文章主要介绍了c – 如何快速删除数百万个文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们使用BOOST1.63 boost :: filesystem :: remove_all(dir_to_remove)来删除包含数百万个文件文件夹(每个文件的大小为1MB).文件夹“dir_to_remove”具有子文件夹,每个子文件夹的文件不超过1000个.删除所有文件需要10分钟以上.我们使用CentOS6.5.

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

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

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

我们如何用C快速删除数百万个文件

解决方法

是的,std :: filesystem :: directory_iterator非常糟糕.我希望在即将到来的 P1031 Low level file i/o中完全取代该设施(注意不会在WG21上直播到2018年6月),其中有一些可以很好地扩展输入,所以我们就可以了.

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

>从第一个条目开始取消链接.
>从最后一个条目取消链接.
>从第一个条目取消链接,然后从最后一个条目取消链接,向中心移动.

我会根据您的特定文件系统对所有六种方法进行基准测试,并选择最快的方法.有些使用基于inode编号的B树,有些基于leafname,它会有所不同.但基本上你想避免过多的树重新平衡,并避免对叶名的深O(log N)查找,因此有序的取消链接.

猜你在找的C&C++相关文章