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秒.
我知道我有点贪心,但我希望有更好的解决方案.
劳伦特卢斯
快速分析代码表明,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本身一样快,至少在我的机器上.
| 归档时间: |
|
| 查看次数: |
5910 次 |
| 最近记录: |