【问题标题】:google-coud-storage python list_blobs performance谷歌云存储 python list_blob 性能
【发布时间】:2019-07-07 02:05:54
【问题描述】:

我有一个非常简单的python函数:

def list_blobs(bucket, project)
    storage_client = storage.Client(project=project)
    bucket = storage_client.get_bucket(bucket)
    blobs = bucket.list_blobs(prefix='basepath/', max_results=999999,
                              fields='items(name,md5Hash),nextPageToken')
    r = [(b.name, b.md5_hash) for b in blobs]

blob 列表包含 14599 个项目,此代码需要 7 秒才能运行。 分析时,大部分时间都浪费在从服务器读取数据上(对 page_iterator._next_page 的调用有 16 次。

那么,我该如何改进呢?迭代代码在库中很深,每个页面的指针都来自前一页,所以我看不出如何并行获取 16 个页面,因此我可以减少这 7 秒。

我在 python 3.6.8,

google-api-core==1.7.0
google-auth==1.6.2
google-cloud-core==0.29.1
google-cloud-storage==1.14.0
google-resumable-media==0.3.2
googleapis-common-protos==1.5.6
protobuf==3.6.1

【问题讨论】:

    标签: python google-cloud-storage google-api-python-client


    【解决方案1】:

    您的max_results=999999 大于 14599 - 对象的数量,强制所有结果进入一个单个页面。来自Bucket.list_blobs()

    参数:

    ma​​x_results (int) - (可选)此请求的每页结果中的最大 blob 数。忽略非正值。 默认为 API 设置的合理值。

    我的猜测是代码花费大量时间等待服务器提供迭代结果所需的信息。

    所以我要尝试的第一件事是实际迭代多个页面,使用小于 blob 数量的max_results。可能是 1000 或 2000,看看对整体持续时间的影响?

    甚至可能尝试使用blobs.pages 明确地使用多个页面,正如已弃用的page_token 属性文档(强调我的)中所建议的那样:

    page_token (str) –(可选)如果存在,则返回下一批 blob,使用该值,该值必须对应于 nextPageToken 上一个响应中返回的值。 已弃用:使用 pages 返回的迭代器的属性,而不是手动传递 令牌

    但我不太确定如何强制同时拉出多个页面。也许是这样的?

    [(b.name, b.md5_hash) for page in blobs.pages for b in page]
    

    【讨论】:

    • 我将对这些建议进行一些测试,看看它是否有所改进。它已经调用了 _next_page 16 次,所以我猜这意味着它正在读取 16 个不同的页面,所以我的 max_results 被完全忽略了(看起来我每页或多或少地得到 1000 个结果)。
    • 你解决了吗? blobs.pages 的东西有用吗?
    猜你喜欢
    • 2020-09-10
    • 2016-10-12
    • 2021-08-20
    • 1970-01-01
    • 2012-03-02
    • 2012-08-19
    • 2017-01-11
    • 1970-01-01
    相关资源
    最近更新 更多