【问题标题】:How to increase the ResponseBodySize of blob_client.download_blob() (Azure Blob Storage Python SDK)如何增加 blob_client.download_blob() 的 ResponseBodySize (Azure Blob Storage Python SDK)
【发布时间】:2021-08-26 22:54:54
【问题描述】:

查看一些 Azure Log Analytics 日志,我发现每次我的 Python Azure 函数从 Azure 存储下载 blob 时,都会有一个初始的 32MB 块,然后所有后续的 GetBlob 操作都是 4MB 块。

我怎样才能增加这个数字来减少我的函数执行的时间?

从存储下载 blob 的 Python 示例(Azure 函数):

def load_blob_to_memory(blob_client):
    blob_data = blob_client.download_blob().readall()
    blob_bytes = io.BytesIO(blob_data)
    return blob_bytes

显示 ResponseBodySize 的示例 Log Analytics:

  • 查询:
//==================================================//
// Assign variables
//==================================================//
let varStart = ago(2d);
let varEnd = now();
let varStorageAccount = 'stgtest';
let varIngressContainerName = 'cont-test';
let varFileName = 'test.csv';
let varSep = '/';
let varSampleUploadUri = strcat('https://', varStorageAccount, '.dfs.core.windows.net', varSep, varIngressContainerName, varSep, varFileName);
let varSampleDownloadUri = replace(@'%2F', @'/', replace(@'.dfs.', @'.blob.', tostring(varSampleUploadUri)));
//==================================================//
// Filter table
//==================================================//
StorageBlobLogs
| where TimeGenerated between (varStart .. varEnd)
  and AccountName == varStorageAccount
  //and StatusText == varStatus
  and split(Uri, '?')[0] == varSampleUploadUri
  or split(Uri, '?')[0] == varSampleDownloadUri
| summarize 
  count() by OperationName,
  TimeGenerated,
  UserAgent = tostring(split(UserAgentHeader, '(')[0]),
  FileName = tostring(split(tostring(parse_url(url_decode(Uri))['Path']), '/')[-1]),
  DownloadChunkSize = format_bytes(ResponseBodySize, 2, 'MB'),
  StatusCode,
  StatusText
| order by TimeGenerated asc
  • 输出:
6/9/2021, 6:24:22.226 PM    GetBlob azsdk-python-storage-blob/12.8.1 Python/3.8.10  test.csv    32 MB   206 Success 1   
6/9/2021, 6:24:22.442 PM    GetBlob azsdk-python-storage-blob/12.8.1 Python/3.8.10  test.csv    4 MB    206 Success 1   
6/9/2021, 6:24:22.642 PM    GetBlob azsdk-python-storage-blob/12.8.1 Python/3.8.10  test.csv    4 MB    206 Success 1   
6/9/2021, 6:24:22.780 PM    GetBlob azsdk-python-storage-blob/12.8.1 Python/3.8.10  test.csv    4 MB    206 Success 1

BlobClient 类的 download_blob() 方法有一个 max_concurrency parameter,但我不确定它是否需要完全异步/等待代码重写。

编辑 1: 谢谢@Guarav。这将默认值增加到32MB

def create_blob_client(credentials):
    blob_client = BlobClient.from_blob_url(
                      event.get_json()["blobUrl"], 
                      credentials, 
                      max_single_get_size = 64*1024*1024, 
                      max_chunk_get_size = 32*1024*1024
    )
    return blob_client

【问题讨论】:

    标签: python concurrency azure-functions azure-blob-storage


    【解决方案1】:

    请查看BlobClient 构造函数的max_single_get_sizemax_chunk_get_size 参数。您可以调整这两个以增加单个请求中下载的数据量。

    来自文档:

    ma​​x_single_get_size

    在单个调用中下载 blob 的最大大小,即 超出部分将分块下载(可能是并行的)。 默认为 3210241024 或 32MB。

    ma​​x_chunk_get_size

    用于下载 blob 的最大块大小。默认为 410241024,或 4MB。

    【讨论】:

    • 上面的 EDIT 1: 之类的?
    • 我没试过,但我觉得没问题。你可以试试运行这段代码吗?
    • 好像没有上限。我查看了源代码here,它唯一要做的就是设置默认值(分别为 32 MB 和 4 MB)。所以我想这取决于网络速度和最大缓冲区大小。
    • 我目前使用的是 100MB。可能会尝试一些更高的值,看看会发生什么。这一调整大大减少了函数的执行时间。
    • 将两个值都设置为1024*1024*1024512*1024*1024 崩溃blob_bytes = io.BytesIO(blob_data)。我是 Python 新手,所以可能有一些方法可以在 io.BytesIO() 中设置缓冲区大小来帮助解决这个问题,但我不太确定如何。有一个DEFAULT_BUFFER_SIZE 属性,但它似乎是从其他地方继承而不是可设置的。到目前为止,max_single_get_size =256*1024*1024max_chunk_get_size = 128*1024*1024 运行良好。
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2019-04-25
    • 2017-10-17
    • 2021-10-26
    • 2021-02-15
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多