Сжатие потока из Azure Blob (Python SDK)

#azure #azure-blob-storage

#azure #azure-blob-хранилище

Вопрос:

Могу ли я сжимать данные из 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)
  

Ответ №1:

Я думаю, вы знаете, как сжимать данные. Итак, ниже приведены лишь некоторые пояснения.

Я не уверен, был ли весь blob-объект в памяти до сжатия.

Когда нам нужно загрузить данные большого двоичного объекта для обработки, мы используем официальный метод загрузки большого двоичного объекта. На данный момент он находится в форме потока. Его нет на диске, но, конечно, он будет использовать память, выделенную программой.

Azure не предоставляла метод предварительного сжатия данных в azure:

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

Поэтому, когда мы хотим обработать данные, мы должны сначала загрузить их, и когда они загружаются в виде потока, они, конечно, будут занимать память.

Комментарии:

1. И нет способа сжимать «фрагменты» по мере их загрузки? Насколько я понимаю, когда вы загружаете данные из потока, они загружаются порциями байт — интересно, можно ли сжать каждый фрагмент, чтобы минимизировать объем памяти?