首页 > 解决方案 > 如何使用 python 和 boto3 改进获取对象大小?

问题描述

我在本地使用 Cloudian Storage 和 S3 API。我需要在没有 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-s3boto3

解决方案


我找到了一种将 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)

推荐阅读