【问题标题】:Compressing a stream from Azure Blob (Python SDK)压缩来自 Azure Blob (Python SDK) 的流
【发布时间】:2020-12-10 02:22:38
【问题描述】:

我可以在下载数据时将数据从 Azure Blob 压缩到 gzip 吗?如果可能,我想避免将所有数据都放在内存中。

我尝试了两种不同的方法(compress_chunk 和 compress_blob)函数。我不确定整个 blob 在压缩之前是否在内存中,或者我是否可以在以某种方式读取它时对其进行压缩。

def compress_chunk(data):
    data.seek(0)
    compressed_body = io.BytesIO()
    compressor = gzip.open(compressed_body, mode='wb')
    while True:
        chunk = data.read(1024 * 1024 * 4)
        if not chunk:
            break
        compressor.write(chunk)
    compressor.flush()
    compressor.close()
    compressed_body.seek(0, 0)
    return compressed_body

def compress_blob(data):
    compressed_body = gzip.compress(data.getvalue())
    return compressed_body

def process_download(container_name, blob):
    with io.BytesIO() as input_io:
        blob_service.get_blob_to_stream(container_name=container_name, blob_name=blob.name, stream=input_io)
        compressed_body = compress_chunk(data=input_io)

【问题讨论】:

    标签: azure azure-blob-storage


    【解决方案1】:

    我想你知道如何压缩数据。所以以下只是做一些澄清。

    虽然之前我不确定整个 blob 是否在内存中 压缩。

    当我们需要下载blob数据进行处理时,我们使用官方的方法下载blob。此时,它是流的形式。它不在磁盘上,但它当然会使用程序分配的内存。

    Azure 没有提供在 azure 上预压缩数据的方法:

    https://docs.microsoft.com/en-us/python/api/azure-storage-blob/azure.storage.blob.blobclient?view=azure-python#methods

    因此,当我们要处理数据时,必须先下载,当以流的形式下载时,当然会占用内存。

    【讨论】:

    • 下载时没有办法压缩“块”吗?据我了解,当您从流中下载数据时,它是以块字节的形式下载的 - 我想知道是否可以压缩每个块以最小化内存占用?
    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 2020-01-23
    • 2021-11-19
    • 2020-04-15
    • 2021-11-22
    • 2012-09-16
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多