我正在尝试使用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
答案 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)