2017-07-30 126 views
0

我寫的總結文件的大小子目錄FTP服務器上的腳本:如何優化這個遞歸文件大小函數?

for dirs in ftp.nlst("."): 
    try: 
     print("Searching in "+dirs+"...") 
     ftp.cwd(dirs) 
     for files in ftp.nlst("."): 
       size += ftp.size(files) 
     ftp.cwd("../") 
    except ftplib.error_perm: 
     pass 
print("Total size of "+serveradd+tvt+" = "+str(size*10**-9)+" GB") 

有沒有更快的方式獲得整個目錄樹的比總結文件大小爲所有目錄其他大小?

+0

我是原始的海報。我只是想知道是否有任何優化它的方法。對於300 GB的目錄大小,需要5分鐘才能完成。但是,unix命令'du -h'會立即完成打印總目錄大小。 –

+1

您是否嚴格限制於FTP而不是SSH? –

+0

我相信是這樣的... –

回答

1

Alex Hall評論說,這不是遞歸的。我將解決加速問題,因爲您可以從多個來源閱讀遞歸,例如here。 放在一邊,你沒有提到那個目錄中有多少文件,但是你花費了整個往返過程來處理目錄中的每個文件。相反,要求服務器返回整個清單目錄,總結文件大小:

import re 

class DirSizer: 
    def __init__(self): 
     self.size = 0 

    def add_list_entry(self, lst): 
     if '<DIR>' not in lst: 
      metadata = re.split(r'\s+', lst) 
      self.size += int(metadata[2]) 

ds = DirSizer() 
ftp.retrlines('LIST', ds.add_list_entry) # add_list_entry will be called for every line 
print(ds.size) # => size (shallow, currently) of the directory 

需要注意的是:

  • 這當然應該遞歸樹中的每個目錄來完成的。
  • 您的服務器可能會以不同的格式返回列表,因此您可能需要更改re.split行或metadata[2]部分。
  • 如果您的服務器支持MLSD FTP命令,請使用它,因爲它將採用標準格式。
  • See here對於retrlines和回調的解釋。