gpt4 book ai didi

amazon-web-services - 使用 boto3 时如何提高 AWS s3 上传速度?

转载 作者:行者123 更新时间:2023-12-04 04:29:58 29 4
gpt4 key购买 nike

嘿,有一些类似的问题,但没有一个完全像这样,而且相当多的问题已经存在多年并且已经过时了。

我在我的服务器上编写了一些代码,通过 boto3 方法 upload_file 使用 key 将 jpeg 照片上传到 s3 存储桶中。最初这看起来很棒。这是一个将文件上传到 s3 的 super 简单的解决方案。

问题是,我有用户。我的用户通过电话应用程序将他们的 jpeg 发送到我的服务器。虽然我承认我可以生成预先签名的上传 URL 并将它们发送到电话应用程序,但这需要对我们的电话应用程序和 API 进行大量重写。

所以我只希望手机应用程序将照片发送到服务器。然后我想将照片从服务器发送到 s3。我实现了这个,但它太慢了。我不能要求我的用户容忍这些缓慢的上传。

我能做些什么来加快速度?

我做了一些谷歌搜索,发现了这个:https://medium.com/@alejandro.millan.frias/optimizing-transfer-throughput-of-small-files-to-amazon-s3-or-anywhere-really-301dca4472a5

它建议解决方案是增加 TCP/IP 连接数。更多的 TCP/IP 连接意味着更快的上传。

好的,太好了!

我怎么做?如何增加 TCP/IP 连接数,以便更快地将单个 jpeg 上传到 AWS s3?

请帮忙。

最佳答案

具有讽刺意味的是,我们一直在使用 boto3多年来,以及 awscli ,我们都喜欢他们。

但是我们经常想知道为什么 awscli 的 aws s3 cp --recursive , 或 aws s3 sync ,通常比尝试通过 boto3 进行大量上传要快得多。 ,即使是 concurrent.futuresThreadPoolExecutorProcessPoolExecutor (你甚至不敢在你的 worker 之间共享相同的 s3.Bucket:它在 the docs 中被警告,并且有充分的理由;讨厌的崩溃最终会在最不方便的时候接踵而至)。

最后,我硬着头皮查看了 awscli 在 boto3 之上引入的“自定义”代码。 .

基于这个小小的探索,这里有一种方法可以通过使用已内置于 boto3.s3.transfer 中的并发来加快将许多文件上传到 S3 的速度。 ,不仅适用于单个大文件可能的多个部分,还适用于各种大小的一大堆文件。据我所知,该功能并未通过 boto3 的更高级别的 API 公开。 boto3 中描述的文档。

下列:

  • 用途 boto3.s3.transfer创建一个 TransferManager ,与 awscli 的 aws s3 sync 使用的相同, 例如。
  • 将最大线程数扩展到 20。
  • 增强底层证券urllib3 botocore 使用的最大池连接容量匹配(默认情况下,它最多使用 10 个连接)。
  • 为您提供可选的回调功能(此处使用 tqdm 进度条进行演示,但当然您可以使用任何您想要的回调)。
  • 速度很快(超过 100MB/s -- 在 ec2 实例上测试)。

  • 我把一个完整的例子作为要点 here其中包括生成 500 个随机 csv 文件,总共约 360MB。但是,如果您假设您在 filelist 中有一堆文件下面,一共 total_size字节:
    import os
    import boto3
    import botocore
    import boto3.s3.transfer as s3transfer
    import tqdm

    botocore_config = botocore.config.Config(max_pool_connections=20)
    s3client = boto3.client('s3', config=botocore_config)

    transfer_config = s3transfer.TransferConfig(
    use_threads=True,
    max_concurrency=20,
    )

    bucket_name = '<your-bucket-name>'
    s3junkdir = 'some/path/for/junk'

    %%time
    progress = tqdm.tqdm(
    desc='upload',
    total=total_size, unit='B', unit_scale=1,
    position=0,
    bar_format='{desc:<10}{percentage:3.0f}%|{bar:10}{r_bar}')

    s3t = s3transfer.create_transfer_manager(s3client, transfer_config)
    for src in filelist:
    dst = os.path.join(s3junkdir, os.path.basename(src))
    s3t.upload(
    src, bucket_name, dst,
    subscribers=[
    s3transfer.ProgressCallbackInvoker(progress.update),
    ],
    )

    s3t.shutdown() # wait for all the upload tasks to finish
    progress.close();

    关于amazon-web-services - 使用 boto3 时如何提高 AWS s3 上传速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56639630/

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