#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:
Поэтому, когда мы хотим обработать данные, мы должны сначала загрузить их, и когда они загружаются в виде потока, они, конечно, будут занимать память.
Комментарии:
1. И нет способа сжимать «фрагменты» по мере их загрузки? Насколько я понимаю, когда вы загружаете данные из потока, они загружаются порциями байт — интересно, можно ли сжать каждый фрагмент, чтобы минимизировать объем памяти?