aws s3 ls命令对应的boto3等效高效实现方案是什么?
高效实现方案
AWS CLI执行aws s3 ls速度快的核心原因是调用list_objects_v2接口时默认添加了Delimiter='/'参数,S3服务端会直接按路径分隔符分组返回结果,无需拉取prefix下所有层级的全量对象。你现有代码慢就是因为没有加这个参数,会返回prefix下所有嵌套的对象,遍历拼接的开销自然很大。
优化后代码示例
import boto3 s3 = boto3.client('s3') bucket = "my-bucket" prefix = "my-prefix" # prefix如果不以/结尾建议补全,避免匹配到前缀相同的其他目录 if not prefix.endswith('/'): prefix += '/' paginator = s3.get_paginator('list_objects_v2') # 新增Delimiter参数,指定按/分隔路径层级 page_iterator = paginator.paginate( Bucket=bucket, Prefix=prefix, Delimiter='/' ) for page in page_iterator: # 输出当前层级的子目录,和原生ls的PRE格式对齐 for common_prefix in page.get('CommonPrefixes', []): dir_name = common_prefix["Prefix"].split("/")[-2] print(f'PRE {dir_name}/') # 输出当前层级的文件 for content in page.get('Contents', []): file_name = content['Key'].split('/')[-1] print(f'{content["LastModified"]} {content["Size"]} {file_name}')
原理说明
- 传入
Delimiter='/'后,S3会将prefix下所有路径中包含/的嵌套对象归集到CommonPrefixes字段返回,仅返回当前层级的目录和直接存放在当前层级的文件,不会拉取所有下层对象 - 当路径下对象数量极多时,该方式的请求返回数据量仅和当前层级的目录、文件数量相关,和下层嵌套的对象数量无关,性能和AWS CLI完全一致
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

