Boto3 put_object() 很慢

Boto3 put_object() is very slow

TL;DR:尝试使用 Boto3 将 .json 文件放入 S3 存储桶,过程非常缓慢。寻找加快速度的方法。

这是我关于 SO 的第一个问题,所以如果我遗漏了任何重要的细节,我深表歉意。本质上,我正在尝试从 Elasticsearch 中提取数据并使用 Boto3 将其存储在 S3 存储桶中。我参考了this post利用ESPython客户端的滚动功能拉取多页ES数据。当我滚动时,我正在处理数据并将其作为 [timestamp].json 格式放入桶中,使用:

    s3 = boto3.resource('s3')
    data = '{"some":"json","test":"data"}'
    key = "path/to/my/file/[timestamp].json"      
    s3.Bucket('my_bucket').put_object(Key=key, Body=data)

虽然 运行 在我的机器上执行此操作,但我注意到此过程非常缓慢。使用 line profiler,我发现这一行在我的整个程序中消耗了超过 96% 的时间:

    s3.Bucket('my_bucket').put_object(Key=key, Body=data)

我可以做哪些修改来加快这个过程?请记住,我正在我的程序中创建 .json 文件(每个大约 240 字节)并将它们直接流式传输到 S3,而不是将它们保存在本地并上传文件。提前致谢。

由于您可能会上传许多小文件,因此您应该考虑以下几点:

  • threading/multiprocessing 的某种形式。例如你可以看到 How to upload small files to Amazon S3 efficiently in Python
  • 创建某种形式的存档文件 (ZIP),其中包含您的小数据块集,并将它们作为更大的文件上传。这当然取决于您的访问模式。如果你走这条路,一定要使用 boto3 upload_fileupload_fileobj 方法,因为它们将处理多部分上传和线程。
  • Request Rate and Performance Considerations
  • 中所述的 S3 性能影响