Python:快速上传大文件 S3

Posted

技术标签:

【中文标题】Python:快速上传大文件 S3【英文标题】:Python: upload large files S3 fast 【发布时间】:2018-10-10 19:39:47 【问题描述】:

我正在尝试以编程方式在 S3 上上传一个最大为 1GB 的超大文件。当我发现 AWS S3 支持大文件的分段上传时,我找到了一些 Python 代码来做到这一点。 (link)

我的观点:上传速度太慢(几乎 1 分钟)。

有什么方法可以提高分段上传的性能。或者任何好的库支持 S3 上传

【问题讨论】:

如果您使用 WiFi,我认为您的主要限制是您的 Internet 连接和本地网络。听起来您的上传速度接近 20Mb/秒,这几乎没有什么可嘲笑的。您是否尝试过 speedtest 以查看您的 Internet 上传带宽是多少? 我使用办公室wifi进行测试,上传速度在30Mps左右。我要做的是尽可能优化上传代码,以应对现实场景中的不稳定网络 我还发现如果我使用“put_object”的方法,上传速度会快很多,所以我不明白分段上传有什么意义 【参考方案1】:

在此处留下我的答案以供参考,使用此代码可提高两倍的性能:

import boto3
from boto3.s3.transfer import TransferConfig


s3_client = boto3.client('s3')

S3_BUCKET = 'mybucket'
FILE_PATH = '/path/to/file/'
KEY_PATH = "/path/to/s3key/" 

def uploadFileS3(filename):
    config = TransferConfig(multipart_threshold=1024*25, max_concurrency=10,
                        multipart_chunksize=1024*25, use_threads=True)
    file = FILE_PATH + filename
    key = KEY_PATH + filename
    s3_client.upload_file(file, S3_BUCKET, key,
    ExtraArgs= 'ACL': 'public-read', 'ContentType': 'video/mp4',
    Config = config,
    Callback=ProgressPercentage(file)
    )

uploadFileS3('upload.mp4')

特别感谢@BryceH 的建议。虽然解决方案确实提高了 S3 上传的性能,但我仍然愿意接受任何更好的解决方案。谢谢

【讨论】:

这个解决方案看起来很优雅,但它不起作用。响应为 NULL。因此,我们要求您发布经过验证的答案。 仅仅因为它返回 null 并不意味着它不起作用(确实如此)。对于那些寻找 ProgressPercentage() 的人,可以从boto3.amazonaws.com/v1/documentation/api/latest/_modules/boto3/… 复制/粘贴【参考方案2】:

对于互联网上的这么多数据,1 GB 的 1 分钟是相当快的。您应该为此用例考虑 S3 传输加速。 https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html

【讨论】:

是的,我会考虑这个配置。现在我专注于编码。

以上是关于Python:快速上传大文件 S3的主要内容,如果未能解决你的问题,请参考以下文章

支持恢复将大文件上传到 S3

S3 上传程序在尝试上传大文件时抛出异常

Amazon S3 存储桶大文件上传

如何读取大文件并将其上传到 s3?

AWS S3 大文件分片上传

Laravel。存储:FTP,S3还是?对于非常大的文件[关闭]