如何快速删除数百万个文件
How to quickly delete millions of files
我们使用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)
本文列出了几种在Linux上更有效删除文件的方法。并建议使用rsync
。
如何使用C 快速删除数百万个文件?
如果要免费获得所需的位置,则最快的方法是移动(或重命名(目录到同一分区上的另一个位置。然后,您的程序可以继续使用所需的位置工作,并在另一个线程(在后台(中递归递归移动的目录。此线程甚至可以减少优先级,因此删除特定目录看起来像即时文件系统操作。
是的, std::filesystem::directory_iterator
非常容易。我希望在即将到来的P1031低级文件I/O中完全替换该设施(请注意,直到2018年6月才能在WG21上进行实时(,并且可以很好地输入,因此我们正在使用。
同时,我建议您使用https://ned14.github.io/afio/,这是P1031的参考实现,特别是directory_handle::enumerate()
。该图书馆可以轻松处理数百万甚至数千万文件的目录。删除条目列表后,您需要遵循B 树友好的删除模式,即将它们对字母顺序排序或inode顺序进行分类,然后执行以下操作:
- 从第一个条目开始的UNINK。
- 从最后一个条目向后链接。
- 从第一个条目开始,然后是最后一个条目,向中心移动。
我将为您的特定归档系统进行所有六种方法,然后选择最快的方法。有些使用基于Inode编号的B 树,有些基于叶名,它会有所不同。但基本上,您想避免过度平衡树,并避免使用叶名的深度O(log n(查找,因此订购的Unin链路。
您链接到有关壳透视的文章。这至关重要:外壳启动了许多任务的程序。而且,在启动程序非常便宜的同时,当您需要启动一百万个程序时,它可能会很昂贵。这就是rsync
如此有效的原因;单个调用可以完成所有工作。
同样的已经适用于您的程序。您一次启动程序;成本只是您要制作的所有Syscall。
我检查了Syscall列表;没有SYSCALL可以让您使用一个Syscall进行大量删除
根据存储体系结构,您可以通过并行删除文件来加速。因此,将工作分配在std::thread
s之间,或者如果您想快速尝试,请使用OpenMP Pragma。
这就是我管理〜200 TB储物盒的方式。
请注意,如果任何文件链接在一起,则可能有轻微的种族条件,但是只要您处理错误,就可以了。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 两个文件使用彼此的功能-如何解决
- 如何将c++编译为多个文件
- 在C++中一次将矢量值写入多个文件
- 结构包含在两个头文件中,这两个文件我都不拥有
- Eclipse CDT:单个项目中有多个C++文件
- Levenshtein 两个文件的距离花费了太多时间
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 编译多个C++文件.调用二进制文件以运行代码
- 即使我没有包含多个文件,C++中的多个定义错误
- C++读取功能改进,使读取多个文件
- 无法使用 g++ 从多个文件接收正确的输出
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 如何在C++中写入 1000 个文件时有效地缓冲
- 如何在 c++ 中加载 2 个文件?
- 如何使用循环逐个读取C++中的多个文件
- QTableWidget 到多个文件
- 如何快速删除数百万个文件
- 在c++中从文本文件中读取以行分隔的数百万个整数的最有效方法是什么?