如何将ADLS与Databricks递归代码改写为迭代代码(计算目录大小)
迭代版实现思路
- 用栈结构替代递归调用栈:初始化时将根目录路径存入栈中,彻底规避递归深度限制,适配任意层级的ADLS Gen2目录结构
- 遍历逻辑与原递归完全对齐:循环从栈中取出待遍历的目录路径,调用
dbutils.fs.ls获取当前路径下的所有子项 - 子项分类处理:遇到文件就累加大小,符合verbose条件时打印路径和大小;遇到目录就将目录路径压入栈中等待后续遍历
- 功能完全兼容原实现:输入参数、返回值、单位换算规则均和原有递归版本一致,无需修改上层调用逻辑
完整可运行代码
from dbutils import FileInfo from typing import List def true_size(path: str, verbose: bool = True): total_size = 0.0 # 用列表模拟栈,存储待遍历的目录路径 dir_stack = [path] while dir_stack: # 弹出栈顶目录,遍历顺序和原递归深度优先逻辑完全一致 current_dir = dir_stack.pop() path_list = dbutils.fs.ls(current_dir) for path_object in path_list: if path_object.size > 0: size_mb = path_object.size / 1e6 if verbose: print(f"{path_object.path}: {size_mb} MB") total_size += size_mb else: # 目录压入栈,等待后续遍历 dir_stack.append(path_object.path) return total_size
可选优化:如果需要遍历超大规模目录,可将栈替换为collections.deque队列,使用popleft()取路径改为广度优先遍历,内存占用会更平稳,不影响最终统计结果
内容的提问来源于stack exchange,提问作者Sashya Baral
相关产品推荐
相关产品推荐

