[20200414]Linux下快速刪除大量檔案(補充).txt

lfree發表於2020-04-14

[20200414]Linux下快速刪除大量檔案(補充).txt

--//昨天看了連結下面刪除大量檔案的效率.
--//第一感覺這篇文章的內容我在那裡看過,我找了原始連結:


--//原始連結沒有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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2685985/,如需轉載,請註明出處,否則將追究法律責任。

相關文章