Windows上的Python快速文件夹大小计算

Lau*_*uce 6 python windows directory size

我正在寻找一种快速计算Windows上Python文件夹大小的方法.这是我到目前为止:

def get_dir_size(path):
  total_size = 0
  if platform.system() == 'Windows':
    try:
      items = win32file.FindFilesW(path + '\\*')
    except Exception, err:
      return 0

    # Add the size or perform recursion on folders.
    for item in items:
      attr = item[0]
      name = item[-2]
      size = item[5]

      if (attr & win32con.FILE_ATTRIBUTE_DIRECTORY) and \
         not (attr & win32con.FILE_ATTRIBUTE_SYSTEM):  # skip system dirs
        if name not in DIR_EXCLUDES:
          total_size += get_dir_size("%s\\%s" % (path, name))

      total_size += size

  return total_size
Run Code Online (Sandbox Code Playgroud)

当文件夹大小超过100G时,这还不够好.任何想法如何改进它?

在一台快速机器(2Ghz + - 5G内存)上,在226,001个文件和12,043个文件夹中花了72秒超过422GB.使用资源管理器属性选项需要40秒.

我知道我有点贪心,但我希望有更好的解决方案.

劳伦特卢斯

Pet*_*sen 6

快速分析代码表明,FindFilesW()仅在呼叫中就消耗了90%以上的时间.这意味着通过调整Python代码进行的任何改进都是次要的.

微小的调整(如果你坚持使用FindFilesW)可能包括确保DIR_EXCLUDES是一个集合而不是列表,避免在其他模块上重复查找,并且懒惰地索引到item [],以及在外部移动sys.platform检查.这包含了这些变化和其他变化,但它不会提供超过1-2%的加速.

DIR_EXCLUDES = set(['.', '..'])
MASK = win32con.FILE_ATTRIBUTE_DIRECTORY | win32con.FILE_ATTRIBUTE_SYSTEM
REQUIRED = win32con.FILE_ATTRIBUTE_DIRECTORY
FindFilesW = win32file.FindFilesW

def get_dir_size(path):
    total_size = 0
    try:
        items = FindFilesW(path + r'\*')
    except pywintypes.error, ex:
        return total_size

    for item in items:
        total_size += item[5]
        if (item[0] & MASK == REQUIRED):
            name = item[8]
            if name not in DIR_EXCLUDES:
                total_size += get_dir_size(path + '\\' + name)

    return total_size
Run Code Online (Sandbox Code Playgroud)

唯一显着的加速将来自使用不同的API或不同的技术.您在后台执行此操作的评论中提到过,因此您可以使用其中一个程序包对其进行增量更新,以监视文件夹中的更改.可能是FindFirstChangeNotification API或类似的东西.您可以设置监视整个树,或者根据该例程的工作方式(我没有使用它),您可能最好在整个树的各个子集上注册多个请求,如果这样可以减少您的搜索量做(通知时)以确定实际改变的内容和现在的大小.

编辑:我在评论中询问您是否考虑了Windows XP及更高版本所做的繁重的文件系统元数据缓存.我刚刚检查了你的代码(和我的)对Windows本身的性能,选择我的C:\文件夹中的所有项目,然后按Alt-Enter打开属性窗口.在执行此操作一次(使用您的代码)并获得40秒后,我现在从这两种方法中消耗了20秒.换句话说,你的代码实际上和Windows本身一样快,至少在我的机器上.