2017-07-30 77 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和回调的解释。