amazon-s3 - 如何使用 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 代码需要这么长时间吗?我可以改变什么来加快代码速度?
解决方案
我找到了一种将 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)
推荐阅读
- c# - UWP 中的 SelectedItems ListView 绑定失败
- c# - 如何在 C# 中反映字符串类型的不同委托?
- javascript - 为什么我在编辑创建后无法添加新笔记?
- google-cloud-platform - Google Cloud Platform 抢占式实例:磁盘会发生什么?
- windows - 如何启动默认浏览器以打开本地 .html 文件
- sql - 将外部表中的两列复制到另一个表中
- c - sscanf 和 %i / 大无符号整数的基数检测
- c# - EF Core 3.1 更新实体
- php - 从php中的字符串格式化json数据
- airflow - 使用 PythonOperator 的输出从气流到另一个 PythonOperator