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 -rf
2倍快。
并且:rm -r
比“排序列表”方法慢 30 倍
......但是这里的问题是“排序”的吗?还是与 ext4 使用的散列(或其他)存储方法更相关?
令我困惑的是,每次调用rm filename
都与前一个无关..(好吧,至少从“bash”的角度来看是这样的)
我正在使用 Ubuntu / bash / 'ext4' / SATA II 驱动器。
rm -r 预计会因为递归而变慢。必须对目录结构进行深度优先遍历。
那么你是如何创建 1000 万个文件的呢?你是否使用了一些按某种顺序循环的脚本?1.txt,2.txt,3.txt...如果是,那么这些文件也可能以相同的顺序分配在 hdd 中的连续块中。因此按相同的顺序删除会更快。
“ls -f”将启用 -aU,它按目录顺序列出,这又是递归的。