使用python将大型Azure Blob合并到一个本地文件
我正在使用python 3.6和python SDK for Azure blob 1.5.0版,并希望将多个Azure blob合并到单个本地文件中。 我设法做到了,但当我试图附加一个超出机器内存的blob时,操作失败。 按块将blob内容写入文件的最佳方式是什么? 这是我的代码,它不适用于比机器内存大的blob使用python将大型Azure Blob合并到一个本地文件,python,azure,azure-storage-blobs,Python,Azure,Azure Storage Blobs,我正在使用python 3.6和python SDK for Azure blob 1.5.0版,并希望将多个Azure blob合并到单个本地文件中。 我设法做到了,但当我试图附加一个超出机器内存的blob时,操作失败。 按块将blob内容写入文件的最佳方式是什么? 这是我的代码,它不适用于比机器内存大的blob blob_files_names = blob_service.list_blob_names(container_name=blob_container_name, prefix=
blob_files_names = blob_service.list_blob_names(container_name=blob_container_name, prefix=prefix)
with open(trg_path, 'wb') as file:
for blob_file_name in blob_files_names:
blob = blob_service.get_blob_to_bytes(container_name=blob_container_name, blob_name=blob_file_name)
file.write(blob.content)
根据我的经验,似乎有一些大blob的大小超过了本地机器的内存大小,因为您使用的函数
get_blob_to_bytes
将临时将blob内容读取到内存中,以便稍后写入
因此,请使用另一个函数,而不是get\u blob\u to\u bytes
这是我的示例代码,我的虚拟环境基于Python 3.7,通过pip安装Azure Storage blob==1.5.0
使用Azure Storage SDK
from azure.storage.blob.baseblobservice import BaseBlobService
account_name = '<your account name>'
account_key = '<your account key>'
blob_service = BaseBlobService(account_name, account_key)
blob_container_name = '<your container name>'
prefix = '<your blob prefix>'
blob_files_names = blob_service.list_blob_names(container_name=blob_container_name, prefix=prefix)
# from io import BytesIO
from io import FileIO
trg_path = '<your target file path>'
# with open(trg_path, 'wb') as file:
with FileIO(trg_path, 'wb') as file:
for blob_file_name in blob_files_names:
#blob = blob_service.get_blob_to_bytes(container_name=blob_container_name, blob_name=blob_file_name)
print(blob_file_name)
# stream = BytesIO()
blob_service.get_blob_to_stream(container_name=blob_container_name, blob_name=blob_file_name, stream=file)
# file.write(stream.getbuffer())
从azure.storage.blob.baseblobservice导入baseblobservice
帐户名称=“”
帐户密钥=“”
blob\u服务=BaseBlob服务(帐户名称、帐户密钥)
blob_容器_名称=“”
前缀=“”
blob_文件名=blob_服务。列出blob_名称(容器名=blob_容器名,前缀=前缀)
#从io导入字节io
从io导入文件io
训练路径=“”
#打开(trg_路径,'wb')作为文件:
将FileIO(trg_路径“wb”)作为文件:
对于blob_文件名中的blob_文件名:
#blob=blob\u服务。获取\u blob\u到\u字节(container\u name=blob\u container\u name,blob\u name=blob\u file\u name)
打印(blob_文件名)
#stream=BytesIO()
blob\u服务。获取\u blob\u到\u流(container\u name=blob\u container\u name,blob\u name=blob\u file\u name,stream=file)
#file.write(stream.getbuffer())
注意:上面的
BytesIO的流
不会在BytesIO缓冲区中创建值的副本,因此不会消耗大量内存。最后,我通过使用append open模式的函数实现了这一点。
它之所以有效,是因为该函数将每个blob内容按大小块写入文件末尾
谢谢,彼得,我试过了,但没用。整个blob内容在写入磁盘之前写入内存。我可能需要分块写。
blob_files_names = blob_service.list_blob_names(container_name=blob_container_name, prefix=prefix)
for blob_file_name in blob_files_names:
blob_service.get_blob_to_path(container_name=blob_container_name, blob_name=blob_file_name,
file_path=trg_path, max_connections=1, open_mode='ab')