【问题标题】:Can I resume a download from aws s3?我可以从 aws s3 恢复下载吗?
【发布时间】:2019-12-02 01:00:07
【问题描述】:

我正在使用 python boto3 库通过蜂窝连接将文件从 s3 下载到 IOT 设备,这通常很慢且不稳定。

一些文件非常大(250Mb,对于这种情况来说很大)并且网络出现故障并且设备在下载时重新启动。

我想从设备重启时结束的地方继续下载。有什么办法吗?

中止的下载似乎在下载时将下载的数据保留在一个临时文件中,因此数据就在那里。

目标是节省数据传输并使下载更具弹性。

我正在使用分段上传,但不会自动恢复。

我正在做的是这样的:

s3 = boto.resource('s3')
session = boto.session.Session(region_name='eu-central-1', profile_name=profile)
s3client = session.client( 's3', config=boto.session.Config(signature_version='s3v4'))
MB = 1024 ** 2

config = TransferConfig(
    multipart_threshold=10*MB,
    num_download_attempts=100)

def upload():
    s3client.upload_file(Filename=localfile, Bucket=bucket, Key=key, Config=config)

def download():
    s3client.download_file(bucket, key, localfile, Config=config )

# upload from server...
upload()

# .... later, from IOT device
download()

【问题讨论】:

    标签: python amazon-web-services amazon-s3 boto3


    【解决方案1】:

    我不相信 boto3 有可恢复下载功能。

    您可以通过使用远程获取来自己实现一个。使用 head_object 预先找到对象的大小,然后将其拆分为 N 个范围,单独下载它们(可能是 K 个并行块,取决于您的硬件),将它们作为块存储在本地文件系统中,然后重新组合它们所有块完成后进入最终下载。

    response = client.get_object(
        Bucket='mybucket',
        Key='mykey',
        Range='bytes=10001-20000'
    )
    

    【讨论】:

    • 是的,这就是票,我只需要围绕这个设计一个跟踪机制。
    【解决方案2】:

    从终端,您可以使用aws s3api 对 s3 进行较低级别的访问。

    size=$(stat myfile.zip); aws s3api get-object --bucket BUCKETNAME --key myfile.zip --range "bytes=$size-" myfile.part; cat myfile.part >> myfile.zip

    我认为你可以通过 python 调用这个命令。不太难。

    【讨论】:

    • 我认为这是最后的手段。但这是用 python 编写的大量实用程序的一部分,所以我更喜欢使用 API 而不是执行外部命令
    • @sagism AWS CLI 使用 AWS 开发工具包(您称之为 API)。因此,您可以对 SDK 使用相同的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多