【问题标题】:Faster Azure blob name search with python?使用 python 更快地搜索 Azure blob 名称?
【发布时间】:2018-12-12 11:28:44
【问题描述】:

我有一个需要在 Azure 上搜索的文件名列表。现在作为一个菜鸟,我正在遍历每个 blob 名称并比较字符串,但我认为必须有最简单快捷的方法来完成这项工作。当前的解决方案使我的 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)

【问题讨论】:

  • 不要分享私人信息。
  • @Sraw 我知道,我已经更改了关键数据。 :)

标签: python python-3.x azure azure-blob-storage


【解决方案1】:

请在azure storage python sdk中使用exists方法。

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)

当然,如果你有文件名列表,你至少需要循环调用上面的函数。

希望对你有所帮助。

【讨论】:

  • 我在 Azure 上有 19 个文件,解决方案我需要 24 秒来遍历每个文件。您提出的解决方案需要 19 秒。 @Evandro Paula 提出的解决方案所花费的时间相同
  • 据我所知,没有这种直接的方法来检查 Blob 存储的列表文件名是否存在。
  • Pawan...想一想当您必须在 100000 个或更多 blob 中搜索这 19 个 blob 的场景。 Jay 和 Evandro 提出的解决方案将比您当前的解决方案更有效。
  • 即使我使用 Jay 解决方案也同样担心。对于数千个条目,使用搜索是一个巨大的挑战。
【解决方案2】:

列出所有 blob 在 Azure 存储基础架构中是非常昂贵的操作,因为它会转化为完整扫描。

在下面找到一个示例,以有效检查给定容器中是否存在 blob(例如文件名):

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)

下面是我在美国西部的笔记本电脑上进行的快速执行测试的屏幕截图(根据 Google 速度测试,下载速度约为 150 Mbps,上传速度约为 3.22 Mbps),检查美国西部的 LRS 存储帐户中是否存在 9 个 blob好吧。

【讨论】:

  • 我在 Azure 上有 19 个文件,解决方案我需要 24 秒来遍历每个文件。您提出的解决方案需要 19 秒。 @Jay Gong 提出的解决方案所花费的时间相同
  • 执行时间的微小差异可能是由于 Azure 存储中的文件数量较少(例如 19 个文件)与正在比较的文件(例如可能是 15 个)相比。如果您有 15 个文件来检查容器中的 10K 文件怎么办?它不会扩展(例如分页、延续令牌、多个 HTTP 请求等)。此外,根据消耗的 IOPS 数量,它可能会导致超时、限制和其他不良副作用。
  • 我担心同样的情况。我会接受您的解决方案,但搜索时间仍然很长。
  • 我刚刚添加了一个更接近您的场景的函数,它接收要验证的文件列表而不是单个文件,并运行快速测试以检查是否存在 9 个 blob(
  • 太棒了,str(datetime.now()) 开始 --> 2018-07-04 13:10:11.039050 str(datetime.now()) 结束 --> 2018-07-04 13 :10:17.125398 只用了 6 秒。那好多了。 :)
猜你喜欢
  • 2020-01-02
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2019-04-04
  • 2014-09-26
  • 2018-02-09
相关资源
最近更新 更多