Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python将大型Azure Blob合并到一个本地文件_Python_Azure_Azure Storage Blobs - Fatal编程技术网

使用python将大型Azure 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=

我正在使用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=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')