2017-07-30 8 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

SSHではなくFTPに厳密に限定されていますか? –

+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 hereretrlinesの説明とコールバック。
関連する問題