[20200414]Linux下快速删除大量文件(补充).txt
--//昨天看了链接https://www.modb.pro/db/23668=>Linux下面删除大量文件的效率.
--//第一感觉这篇文章的内容我在那里看过,我找了原始链接:
https://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
--//原始链接没有Python方式,记录一下:
import os
import timeit
def main():
for pathname,dirnames,filenames in os.walk('/home/username/test'):
for filename in filenames:
file=os.path.join(pathname,filename)
os.remove(file)
if __name__=='__main__':
t=timeit.Timer('main()','from __main__ import main')
print t.timeit(1)
1.建立测试文件样本:
$ mkdir testtest
$ cd testtest
$ time for i in $(seq 1 500000); do echo testing > $i.txt; done
real 0m42.289s
user 0m6.409s
sys 0m16.296s
--//再次说明,删除操作测试要小心,小心删除重要文件!!
2.你可以发现perl的脚本实际上如下:
$ time perl -e 'unlink for ( <*> )'
$ time perl -e 'for(<*>){((stat)[9]<(unlink))}'
real 0m30.646s
user 0m1.365s
sys 0m8.623s
--//我测试环境。你可以发现perl实际上调用unlink。我发现unlink实际上是也是linux的一个命令。
$ man unlink
UNLINK(1) User Commands UNLINK(1)
NAME
unlink - call the unlink function to remove the specified file
SYNOPSIS
unlink FILE
unlink OPTION
--//你可以发现它支持的参数几乎没有,很纯粹的就是一个删除操作。它的缺点是只能1个1个删除。
$ time ls -1 | xargs -IQ -P20 -r unlink Q
real 0m58.953s
user 0m6.860s
sys 0m49.183s
--//因为1个1个删除,你可以发现执行时间并不是很快,大约需要1分钟。而且我还打开了并行。
--//如果不开平行,几乎需要20分钟完成。
3.修改如下:
$ time ls -1 | xargs -P20 -r rm
real 0m30.573s
user 0m2.007s
sys 0m34.392s
--//几乎接近perl的执行效率,但是sys消耗很大。也就是利用平行执行,可以提高执行效率。
4.另外如果你使用find你可以发现执行效率并不是很高:
--//贴出我的测试结果。
$ time find . -name "*.txt" -print0 | xargs -P 20 -0 -r rm
real 2m14.205s
user 0m0.659s
sys 0m40.367s
$ time find ./ -delete
find: cannot delete ./: Invalid argument
real 2m37.203s
user 0m0.295s
sys 0m13.091s
$ time find ./ -type f -exec rm {} \+ >/dev/null
real 2m38.328s
user 0m0.471s
sys 0m16.027s
5.分析为什么选择find执行更慢:
--//为什么呢?我开始相当然认为问题出在find的输出上。
$ find . -name "*.txt" -print | head -3
./326847.txt
./334810.txt
./341612.txt
--//我开始以为问题出在前面带有./,修改如下:
$ time find . -name "*.txt" -print| sed 's+^./++' | xargs -P 20 -r rm
real 2m19.387s
user 0m1.062s
sys 0m39.686s
--//依旧很慢。
$ time ls -f | xargs -P 20 -r rm
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'
real 2m38.970s
user 0m0.842s
sys 0m40.831s
--//我仅仅换成-f 执行时间就变成了2分38秒。再明白不过了,问题出在输出删除的顺序上。
--//ls -f顺序是乱的。find也是一样。
--// -f do not sort, enable -aU, disable -lst 什么意思不理解。
$ ls -f | head -5
.
..
326847.txt
334810.txt
341612.txt
$ find -name "*.txt" -print | head -5
./326847.txt
./334810.txt
./341612.txt
./432762.txt
./86199.txt
--//几乎是乱序的。linux到底如何读目录结构的,不理解....
$ ls -1 | head -5
100000.txt
100001.txt
100002.txt
100003.txt
100004.txt
100005.txt
$ ls -1 | sort -n | head -5
1.txt
2.txt
3.txt
4.txt
5.txt
--//可以发现ls -1仅仅基本"排序"输出。
$ time find . -name "*.txt" -print| sed 's+^./++' | sort -n | xargs -P 20 -r rm
real 0m27.326s
user 0m1.508s
sys 0m33.834s
--//27秒。如果排序执行效率更高。
$ time find . -name "*.txt" -print| sort -n | xargs -P 20 -r rm
real 0m33.970s
user 0m2.852s
sys 0m34.469s
--//与find输出带./无关,我前面判断有点武断了。
$ time ls -1 | sort -n | xargs -P20 -r rm
real 0m36.091s
user 0m2.258s
sys 0m33.839s
总结:
--//从测试看如果删除顺序与建立顺序一致,视乎删除最快。我仅仅补充一点点自己的建议删除的顺序也很重要。
--//从这个例子:time ls -1 | xargs -IQ -P20 -r unlink Q 也可以看出删除文件顺序对于提高效率也很重要。
--//再次说明学习过程中一些细节很重要。
--//我的文件系统是ext3,有机会看看文件系统目录结构的格式。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2685985/ ,如需转载,请注明出处,否则将追究法律责任。