如何使用python和boto3改善获取对象的大小?

问题描述 投票:0回答:1

我在S3 API的前提下使用Cloudian Storage。我需要监视没有Cloudian管理员访问权限的存储桶的已用大小。

我使用AWS CLI:

./aws --endpoint-url=https://s3-edc.emea.svc.corpintra.net:443 s3api list-objects --bucket edcs3mposdocifyb --output json --query "{\"size\": sum(Contents[].Size), \"objects\": length(Contents[])}"

这大约需要3分钟,结果如下:

{
    "size": 216317367311,
    "objects": 756771
}

我尝试使用boto3通过以下python3脚本获得相同的信息。

import boto3

total_bucket_size = 0
total_bucket_objects = 0
s3 = boto3.resource('s3', aws_access_key_id="****", aws_secret_access_key="***", endpoint_url="https://my.cloudian.fqdn:443", verify="MyChain.cer")
bucket = s3.Bucket("mybucketname")
bucket_name = bucket.name
for obj in bucket.objects.all():
    obj_key = obj.key
    bucket_object = s3.Object(bucket_name, obj_key)
    obj_size = int(bucket_object.content_length)
    total_bucket_size += obj_size
    total_bucket_objects += 1
    print("%010d %s -> %d" %(total_bucket_objects,obj_key,obj_size))

print("Total size: %d" % total_bucket_size)

但是此代码将运行一些小时

目标是将结果写入influxdb。使用InfluxDBClient for python非常容易。

任何人都知道为什么我的boto3代码要花这么长时间?我可以更改些什么来加快代码的速度?

amazon-s3 boto3
1个回答
0
投票

[我找到了一种将python脚本使用的时间减少到4分钟的方法。

total_bucket_size = 0
total_bucket_objects = 0
s3 = boto3.resource('s3', aws_access_key_id="13c81dba2e4e78628c76", aws_secret_access_key="zLmJVNVx03BQaUokmu6bSROskArFKROhwVyoOdcT", endpoint_url="https://s3-edc.emea.svc.corpintra.net:443", verify="DaimlerChain.cer")
bucket = s3.Bucket("edcs3mposdocifyb")
bucket_name = bucket.name
for obj in bucket.objects.all():
    obj_key = obj.key
    #bucket_object = s3.Object(bucket_name, obj_key)
    #obj_size = int(bucket_object.content_length)
    obj_size = obj.size
    total_bucket_size += obj_size
    total_bucket_objects += 1
    print("%010d %s -> %d" %(total_bucket_objects,obj_key,obj_size))

print("Total size: %d" % total_bucket_size)
© www.soinside.com 2019 - 2024. All rights reserved.