Boto3 list_object_v2非常缓慢

时间:2019-09-17 13:20:14

标签: python amazon-s3 boto3

我正在尝试使用Boto3 API(特别是list_objects_v2,因为这是建议的设置)来获取存储桶上的所有密钥。我在S3上的每个存储桶上并行执行8个任务,总计约55 Gb的数据。我已经运行了16个小时以上,没有任何回电。这是预期的行为吗?如果它甚至必须下载整个55Gb,则最多最多无需花费几个小时即可下载(我的网络连接速度非常快)。

AWS速率是否以某种异常方式限制了我?他们的文档说每秒限制为5500个请求。由于我正在查看约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

1 个答案:

答案 0 :(得分:0)

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

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