首页 > 解决方案 > 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

标签: pythonamazon-s3boto3

解决方案


对于任何看到这个的人,我实际上已经得到了答案。关键是不要使用list_objects_v2,而是使用 S3 资源存储桶。这在我的机器上至少快 10 倍,我想应该总是首选。

bucket = boto3.resource('s3').Bucket('bucket-name')
keys = []
for obj in bucket.objects.all():
    keys.append(obj.key)

推荐阅读