寻求按指定模式列出Azure Data Lake存储文件的高效优化方案
ADLS文件列表提取提速方案
你当前使用os.walk遍历Azure Data Lake(ADLS)速度慢的核心原因是os.walk为本地文件系统设计,每访问一层目录都要发起一次远程存储请求,大量网络往返开销直接拖慢了整体速度,尤其是存储内文件、目录数量较多时,性能衰减会非常明显。可通过以下方案优化:
1. 优先使用适配ADLS的专用访问接口
- 如果你是在Databricks环境运行代码(代码里出现了dbfs路径标识),直接用
dbutils.fs.glob接口,该接口底层做了ADLS访问优化,支持直接递归匹配通配符,避免逐层遍历的网络开销,速度比os.walk快5~20倍。
优化后代码示例:pattern = f"*{batch_no}*.*" files_list = [] for root in root_list: # 递归匹配根目录下所有符合规则的文件,不需要自行遍历层级 matched_files = dbutils.fs.glob(f"{root.rstrip('/')}/**/{pattern}", recursive=True) for file_path in matched_files: processed_path = f"{batch_no}{file_path.replace('dbfs:', '').replace('\\', '/')}" files_list.append(processed_path) - 如果是原生Python环境,使用Azure官方ADLS SDK
azure-storage-file-datalake,可以将匹配逻辑推到存储服务端执行,仅返回符合规则的文件信息,减少无效数据传输。
示例代码:from azure.storage.filedatalake import DataLakeServiceClient # 初始化ADLS客户端 service_client = DataLakeServiceClient( account_url="https://<你的存储账号>.dfs.core.windows.net", credential="<你的存储密钥/令牌>" ) file_system_client = service_client.get_file_system_client(file_system="<你的容器名>") files_list = [] # 服务端递归拉取路径下所有文件,仅过滤包含批次号的文件 for path_item in file_system_client.get_paths(path="<根目录路径>", recursive=True): if not path_item.is_directory and str(batch_no) in path_item.name: processed_path = f"{batch_no}/{path_item.name.replace('\\', '/')}" files_list.append(processed_path)
2. 辅助优化技巧
- 如果你清楚文件的存储层级规则(比如所有带年月的文件都存放在
/业务前缀/YYYY/MM/路径下),可以直接构造目标路径跳过无关层级遍历,不需要全量递归。 - 路径替换逻辑可以提前预处理根路径,不需要每个文件都重复执行replace操作,进一步减少CPU开销。
内容的提问来源于stack exchange,提问作者nYuker_98 D
相关产品推荐
相关产品推荐

