ITPub博客

首页 > 自动化运维 > 大规模网络运维 > [20200414]Linux下快速删除大量文件(补充).txt

[20200414]Linux下快速删除大量文件(补充).txt

原创 大规模网络运维 作者:lfree 时间:2020-04-14 11:28:55 0 删除 编辑

[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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969672