如何优化此递归文件大小功能?

时间:2017-07-30 22:38:02

标签: python recursion ftp

我写了一个脚本,它总结了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")

除了总结所有目录的文件大小之外,是否有更快的方法来获取整个目录树的大小?

1 个答案:

答案 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和回调的解释。