为什么按名称删除文件既慢又特别快?

Pet*_*r.O 11 filesystems bash ext4

失礼:我在下面提到的“快速”方法并不比慢速方法快 60 倍。它快了 30 倍。我会把错误归咎于这个小时(凌晨 3 点不是我一天中清晰思考的最佳时间:)。

更新:我添加了测试时间摘要(如下)。
速度因素似乎涉及两个问题:

  • 所用命令的选择(时间比较如下所示)
  • 目录中大量文件的性质......似乎“大是坏”。随着数字的增加,事情变得不成比例地变慢。

所有的测试都是用 100 万个文件完成的。
(真实时间、用户时间和系统时间在测试脚本中)
测试脚本可以在paste.ubuntu.com找到

#
# 1 million files           
# ===============
#
#  |time   |new dir   |Files added in  ASCENDING order  
#  +----   +-------   +------------------------------------------------- 
#   real    01m 33s    Add files only (ASCENDING order) ...just for ref.
#   real    02m 04s    Add files, and make 'rm' source (ASCENDING order) 
#                      Add files, and make 'rm' source (DESCENDING order) 
#   real    00m 01s    Count of filenames
#   real    00m 01s    List of filenames, one per line
#   ----    -------    ------
#   real    01m 34s    'rm -rf dir'
#   real    01m 33s    'rm filename' via rm1000filesPerCall   (1000 files per 'rm' call)
#   real    01m 40s    'rm filename' via  ASCENDING algorithm (1000 files per 'rm' call)
#   real    01m 46s    'rm filename' via DESCENDING algorithm (1000 files per 'rm' call)
#   real    21m 14s    'rm -r dir'
#   real    21m 27s    'find  dir -name "hello*" -print0 | xargs -0 -n 1000 rm'
#   real    21m 56s    'find  dir -name "hello*" -delete'
#   real    23m 09s    'find  dir -name "hello*" -print0 | xargs -0 -P 0 rm'
#   real    39m 44s    'rm filename' (one file per rm call) ASCENDING
#   real    47m 26s    'rm filename' (one file per rm call) UNSORTED
#                                                       
Run Code Online (Sandbox Code Playgroud)

我最近创建并删除了1000万个空测试文件。以名称为基础(即rm filename)删除文件,我发现两种不同方法之间存在巨大时间差异的艰难方法......

两种方法都使用完全相同的rm filename命令。

更新:事实证明,命令并不完全相同......其中一个是一次发送 1000 个文件名到“rm”......这是一个 shell 括号扩展问题,我认为每个文件名都被写入到它自己一行的 feeder 文件,但实际上它是每行 1000

文件名通过“馈送文件”提供到while read循环中。
馈送文件是 的输出ls -1 -f
方法在所有方面都是相同的,除了一件事:

  • 缓慢的方法使用未排序的馈线文件直接ls -1 -f
  • 快速方法使用相同的未分类文件的排序版本

我不确定排序是否是这里的问题,或者排序的 feeder 文件是否恰好与创建文件的顺序相匹配(我使用了一个简单的升序整数算法)

对于 100 万个文件,快速 rm filename方法比慢速方法快60倍......再次,我不知道这是“排序”问题,还是幕后哈希表问题......我怀疑它不是一个简单的排序问题,因为为什么会故意给我一个不排序文件名的新加入的“排序”序列的上市... ls -1 -f

我只是想知道这里发生了什么,所以删除接下来的 1000 万个文件不需要我几天(是的几天):) .... 我说“几天”是因为我尝试了很多替代方法,并且涉及的时间与涉及的文件数量不成比例地增加..所以我只详细测试了100万个

顺便说一句:通过名称的“排序列表”删除文件实际上比rm -rf2倍快。
并且:rm -r比“排序列表”方法慢 30 倍

......但是这里的问题是“排序”的吗?还是与 ext4 使用的散列(或其他)存储方法更相关?

令我困惑的是,每次调用rm filename都与前一个无关..(好吧,至少从“bash”的角度来看是这样的)

我正在使用 Ubuntu / bash / 'ext4' / SATA II 驱动器。

raj*_*h87 2

rm -r 预计会因为递归而变慢。必须对目录结构进行深度优先遍历。

那么你是如何创建 1000 万个文件的呢?你是否使用了一些按某种顺序循环的脚本?1.txt,2.txt,3.txt...如果是,那么这些文件也可能以相同的顺序分配在 hdd 中的连续块中。因此按相同的顺序删除会更快。

“ls -f”将启用 -aU,它按目录顺序列出,这又是递归的。