Python2.7下如何按指定步长抽样外推估算目录总大小
大目录大小抽样外推实现(适配Python 2.7环境)
原实现的常见精度问题点
- Python 2.7 环境下的整数除法截断问题:原代码中涉及比例计算的环节直接对整数做除法运算,会因为取整丢失小数部分,导致外推系数计算偏差
- 抽样偏差问题:直接对
os.listdir返回的文件列表做固定步长切片,没有考虑返回列表的排序特性,容易抽到同类型、同大小区间的文件,导致样本不能代表整体分布 - 场景覆盖不全:原代码仅统计当前第一层目录的文件,没有递归扫描嵌套的子目录结构,遇到多层目录时统计值会严重偏小
- 外推系数逻辑错误:原代码单独拆分余数计算额外步长,存在系数重复叠加的问题,实际正确的外推逻辑只需要用总文件数除以实际抽到的有效文件数即可
参考优化实现
import os import math import random def estimate_dir_size(path, sample_count=5): # 递归收集路径下所有非符号链接的文件路径 all_valid_files = [] for root, _, file_list in os.walk(path): for file_name in file_list: full_path = os.path.join(root, file_name) if not os.path.islink(full_path): all_valid_files.append(full_path) total_file_count = len(all_valid_files) # 边界场景:文件总量小于设定样本数时,直接全量统计无误差 if total_file_count <= sample_count: total_size = 0 for fp in all_valid_files: total_size += os.path.getsize(fp) return total_size # 随机打乱文件列表,避免排序带来的抽样偏差 random.shuffle(all_valid_files) # 计算均匀抽样步长 sample_step = int(math.ceil(total_file_count / float(sample_count))) sampled_list = all_valid_files[::sample_step] # 计算外推系数:总文件数 / 实际抽样得到的文件数 extrapolate_factor = total_file_count / float(len(sampled_list)) # 计算抽样样本的总大小后外推 sample_total = 0 for fp in sampled_list: sample_total += os.path.getsize(fp) return int(sample_total * extrapolate_factor)
精度优化提示
抽样外推的误差和目录内文件的大小分布直接相关:如果目录内文件大小差异悬殊,可适当调高
sample_count参数的取值,降低随机抽样带来的结果偏差。
内容的提问来源于stack exchange,提问作者tas
相关产品推荐
相关产品推荐

