我们使用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)
解决方法
是的,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)查找,因此有序的取消链接.