Более быстрый поиск имени BLOB-объекта Azure с помощью Python? - PullRequest
0 голосов
/ 04 июля 2018

У меня есть список имен файлов, которые мне нужно искать в Azure. Прямо сейчас, как нуб, я зацикливаюсь на именах каждого блоба и сравниваю строки, но я думаю, что должен быть самый простой и быстрый способ сделать это. Текущее решение делает мой HTTP-ответ очень медленным.

def ifblob_exists(self, filename):
        try:
            container_name = 'xxx'
            AZURE_KEY = 'xxx'
            SAS_KEY = 'xxx'
            ACCOUNT_NAME = 'xxx'
            block_blob_service = BlockBlobService(account_name= ACCOUNT_NAME, account_key= None, sas_token = SAS_KEY, socket_timeout= 10000)

            generator = block_blob_service.list_blobs(container_name)
            for blob in generator:
                if filename == blob.name:
                    print("\t Blob exists :"+" "+blob.name)
                    return True
                else:
                    print('Blob does not exists '+filename)
                    return False
        except Exception as e:
            print(e)

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Пожалуйста, используйте exists метод в Azure Storage Python SDK.

def ifblob_exists(filename):
    try:
        container_name = '***'

        block_blob_service = BlockBlobService(account_name=accountName, account_key=accountKey,
                                              socket_timeout=10000)

        isExist = block_blob_service.exists(container_name, filename)
        if isExist:
            print("\t Blob exists :" + " " + filename)
        else:
            print("\t Blob exists :" + " " + filename)

Конечно, если у вас есть список имен файлов, вам нужно как минимум выполнить цикл вызова над функцией.

Надеюсь, это поможет вам.

0 голосов
/ 04 июля 2018

Перечисление всех больших двоичных объектов - это очень дорогая операция в инфраструктуре хранилища Azure, поскольку она переводится в полное сканирование.

Ниже приведен пример эффективной проверки того, существует ли большой двоичный объект (например, имя файла в вашем случае) или нет в данном контейнере:

from azure.storage.blob import BlockBlobService
from datetime import datetime

def check_if_blob_exists(container_name: str, blob_names: []):
    start_time = datetime.now()

    if not container_name or container_name.isspace():
        raise ValueError("Container name cannot be none, empty or whitespace.")

    if not blob_names:
        raise ValueError("Block blob names cannot be none.")

        block_blob_service = BlockBlobService(account_name="{Storage Account Name}", account_key="{Storage Account Key}")

    for blob_name in blob_names:
        if block_blob_service.exists(container_name, blob_name):
            print("\nBlob '{0}' found!".format(blob_name));
        else:
            print("\nBlob '{0}' NOT found!".format(blob_name));

    end_time = datetime.now()

    print("\n***** Elapsed Time => {0} *****".format(end_time - start_time))

if __name__ == "__main__":
    blob_names = []

    # Exists
    blob_names.append("eula.1028.txt")
    blob_names.append("eula.1031.txt")
    blob_names.append("eula.1033.txt")
    blob_names.append("eula.1036.txt")
    blob_names.append("eula.1040.txt")

    # Don't exist
    blob_names.append("blob1")
    blob_names.append("blob2")
    blob_names.append("blob3")
    blob_names.append("blob4")

    check_if_blob_exists("containername", blob_names)

Ниже приведен снимок экрана быстрого теста выполнения с моего ноутбука из Западной США (~ 150 Мбит / с загрузки, ~ 3,22 Мбит / с загрузки, на Google Speed ​​Test), проверяющего, существует ли 9 BLOB-объектов в учетной записи хранения LRS в Западной США, как хорошо.

enter image description here

...