gpt4 book ai didi

python - 如何将 Azure Blob 流式传输到 AWS S3?

转载 作者:行者123 更新时间:2023-12-03 19:09:18 24 4
gpt4 key购买 nike

我需要将一个大型 Azure Blob 复制到 AWS S3,而不在内存中保留它的副本。经过一番谷歌搜索后,我发现了一堆我在以下脚本中组合的示例。尽管如此,这仍然将数据加载到内存中。有什么好的方法可以避免吗?

import boto3
from azure.storage.blob import BlobClient

with io.BytesIO() as input_stream, io.BytesIO() as output_stream:
blob_client = BlobClient.from_connection_string(
conn_str=AZURE_CONNECTION_STRING,
container_name=container,
blob_name=filename,
)
blob_client.download_blob().readinto(input_stream)

input_stream.seek(0)
shutil.copyfileobj(input_stream, output_stream)
output_stream.seek(0)

boto3.resource("s3").Object(BUCKET_NAME, s3_key).put(Body=output_stream)

最佳答案

blob 的副本在内存中,因为您似乎一口气读取了它。您正在初始化 io.BytesIO 的两个实例,但随后您正在使用 blob_client.download_blob().readinto(input_stream) 读取整个 blob .
我认为您应该尝试的是读取(并放入)blob 的块,一次一个块,避免将其全部读取到内存中。
在上传端 (s3),您可以通过两种方式解决该问题。您可以:

  • 使用S3部分(multipart)上传机制(使用.upload()发起,然后.upload_part()上传每个部分(chunk),或者
  • .upload_fileobj() 提供类似文件的对象这将负责一次提供一个块

  • 据我所知,似乎是 blob_client.download_blob()已经返回一个名为 StorageStreamDownloader 的类文件对象,实现了 chunks()方法。我找不到合适的文档, but according to the source code ,似乎它正在返回一个您可以使用的迭代器。
    因此,请考虑这样的事情(此时我无法访问任何 azure/s3 服务,因此此代码可能无法开箱即用):
    import boto3
    from boto3.s3.transfer import TransferConfig, S3Transfer

    blob_client = BlobClient.from_connection_string(
    conn_str=AZURE_CONNECTION_STRING,
    container_name=container,
    blob_name=filename,
    )
    s3 = boto3.resource('s3')

    mpu = s3.create_multipart_upload(Bucket=BUCKET_NAME, Key=s3_key)
    mpu_id = mpu["UploadId"]

    blob = blob_client.download_blob()
    for part_num, chunk in enumerate(blob.chunks()):
    s3.upload_part(
    Body=chunk,
    Bucket=BUCKET_NAME,
    Key=s3_key,
    UploadId=mpu_id,
    PartNumber=part_num,
    )
    就像我提到的 - 我现在无法访问任何 blob 存储/s3 资源,所以我盯着代码。但总体思路应该是一样的。通过使用 .chunks()对于 blob,您应该只将一小块数据提取到内存中,将其(使用 MPU)上传到 S3 并立即丢弃。

    关于python - 如何将 Azure Blob 流式传输到 AWS S3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62711546/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com