我们使用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命令:
# define BOOST_REMOVE_DIRECTORY(P)(::rmdir(P)== 0)
# define BOOST_DELETE_FILE(P)(::unlink(P)== 0)这个文章列出了几种在Linux上更有效地删除文件的方法。并建议使用rsync。
如何使用C++快速删除数百万个文件?
发布于 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顺序排序,然后执行以下操作之一:
我将对所有六种方法进行基准测试,并选择最快的哪一种。有些使用基于inode编号的B+树,有些基于叶名,它是不同的。但基本上,您希望避免过度的树再平衡,并避免对页名进行深度O(log N)查找,从而导致有序的断开链接。
发布于 2018-04-25 01:53:21
如果您想获得所需的位置,最快的方法是将一个目录移动(或重命名)到同一分区上的另一个位置。然后,您的程序可以继续使用所需的位置,并在另一个线程中(在后台)递归地删除先前移动的目录。这个线程甚至可以以较低的优先级工作,因此删除特定的目录看起来就像一个即时的文件系统操作。
发布于 2018-04-25 07:54:59
您链接到的文章讨论了shell透视图。这一点非常重要: shell为许多任务启动程序。虽然启动一个程序非常便宜,但当你需要启动一百万个程序时,它可能会很昂贵。这就是为什么rsync如此有效的原因;一次调用就可以完成所有的工作。
同样的情况已经适用于您的程序。您只需启动一次程序,成本就是您正在制作的所有系统。
我检查了syscall列表;没有syscall允许您对一个syscall进行批量删除,因此您只能在每个文件中删除一个syscall。
https://stackoverflow.com/questions/50012507
复制相似问题