python - Boto3 list_object_v2 非常缓慢
问题描述
我正在尝试使用 Boto3 API(特别是 list_objects_v2,因为这是推荐的)来获取我的存储桶上的所有密钥。我在 S3 上的每个存储桶上并行执行了 8 个任务,总计约 55Gb 的数据。我已经运行了 16 个多小时,但我的电话都没有返回。这是预期的行为吗?如果它甚至必须下载整个 55Gb,那么下载最多不会超过几个小时(我的互联网连接速度非常快)。
AWS 速率是否以某种异常方式限制了我?他们的文档说每秒有 5,500 个请求的限制。由于我正在查看大约 5,000,000 个 S3 项目的顺序,如果我受到我估计的速率限制,那么给定无限快速连接的速率限制不应将我的传输时间限制在 15 分钟以上。所以这不是问题吗?
顺便说一句,这个操作似乎垄断了我的 CPU。下面的代码是我为此调用执行的。我在这里遗漏了什么明显的东西吗?在我看来,它把所有的时间都花在了对list_objects_v2
. 我不是 AWS 专家,所以我所做的事情可能非常糟糕,原因我不知道。
def list_all_keys(self):
reached_end = False
all_keys = []
token = None
while not reached_end:
# will limit to 1000 objects
response = self.client.list_objects_v2(Bucket=self.bucket)
token = response.get('NextContinuationToken', None)
contents = response.get('Contents', [])
all_keys.extend([obj['Key'] for obj in contents])
if not token and response.get('IsTruncated') is False:
reached_end = True
return all_keys
解决方案
对于任何看到这个的人,我实际上已经得到了答案。关键是不要使用list_objects_v2
,而是使用 S3 资源存储桶。这在我的机器上至少快 10 倍,我想应该总是首选。
bucket = boto3.resource('s3').Bucket('bucket-name')
keys = []
for obj in bucket.objects.all():
keys.append(obj.key)
推荐阅读
- python - 如何在百分位上打印一个浮点数?
- anaconda - conda 包安装上的 UnsatisfiableError
- mysql - NodeJS、MySQL - 高级查询
- c - 我怎样才能使用递归公式来获得权力而不给我分段错误?
- javascript - 如何让一个类返回一个值?
- swiftui - 对数组对象的更改未保存到主 ObservableObject
- javascript - 调试高达 809 的基本转换计算器
- html - 如何使用 jinja 在 html 标签中使用变量?
- winappdriver - 如何将 WinAppDriver 切换到另一个版本
- python - 带有逗号的嵌套数组的数据框到json