Python:快速上传大文件至S3

13

我正在尝试在S3上以编程方式上传最大1GB的文件。由于发现AWS S3支持用于大文件的分段上传,因此我找到了一些Python代码来执行此操作。(链接

问题是:上传速度太慢(近1分钟)。

有没有办法提高分段上传的性能?或者有没有好的库支持S3上传?


1
我认为你的主要限制将是你的互联网连接和本地网络(如果你正在使用WiFi)。听起来你的上传速度接近20Mb /秒,这几乎不值得嘲笑。你尝试过speedtest来查看你的互联网上传带宽吗? - dbmitch
我使用了办公室的WiFi进行测试,上传速度约为30Mbps。我想要做的是尽可能地优化上传代码,以应对真实场景中不稳定的网络情况。 - Phong Vu
1
我也发现,如果我使用“put_object”方法,上传速度会更快,所以我不明白分段上传的意义是什么。 - Phong Vu
3个回答

20

留下我的答案供参考,使用这个代码后性能提高了两倍:

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。因此,我们要求您发布经过验证的方法的答案。 - TheExorcist
5
即使函数返回 null,也不代表它没有起作用(实际上是有的)。对于那些正在寻找 ProgressPercentage() 函数的人,可以从 https://boto3.amazonaws.com/v1/documentation/api/latest/_modules/boto3/s3/transfer.html 中复制粘贴。 - Pathead
NameError: name 'ProgressPercentage' is not defined - DevOpsSauce
@Phong Vu同样的TransferConfig在使用boto3下载时不起作用。你知道原因吗? - VinuIsNotUnix

4

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

0
我们可以使用Python的subprocess模块将一个S3存储桶中的较大对象文件复制到另一个S3存储桶。
```python import subprocess
subprocess.call(['aws', 's3', 'cp', 's3:///temp/part-00000.csv', 's3:///temp/samp.csv']) ```
100GB文件拷贝时间约为6分钟。
运行时性能非常好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接