Как улучшить размер объекта с помощью python и boto3? - PullRequest
1 голос
/ 11 февраля 2020

Я использую Cloudian Storage в помещении с S3 API. Мне нужно отслеживать используемый размер корзины без Cloudian Admin Access.

С 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
}

Я пытался получить ту же информацию с помощью следующего скрипта python3, используя boto3.

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)

Но этот код будет работать часы .

Цель состоит в том, чтобы записать результат в приток. С InfluxDBClient это довольно просто для python.

Любая идея, почему мой код boto3 занимает так много времени? Что я могу изменить, чтобы ускорить код?

1 Ответ

0 голосов
/ 11 февраля 2020

Я нашел способ сократить время, которое скрипт 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...