python - Boto3 put_object() 很慢

标签 python elasticsearch amazon-s3 boto3 line-profiler

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

这是我关于 SO 的第一个问题,所以如果我遗漏了任何重要的细节,我深表歉意。本质上,我试图从 Elasticsearch 中提取数据并使用 Boto3 将其存储在 S3 存储桶中。我指的是this post使用 ES Python 客户端的滚动功能拉取多页 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,而不是将它们保存在本地并上传文件。提前致谢。

最佳答案

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

  • 某种形式的线程/多处理。例如你可以看到 How to upload small files to Amazon S3 efficiently in Python
  • 创建某种形式的存档文件 (ZIP),其中包含一组小数据块并将它们作为较大的文件上传。这当然取决于您的访问模式。如果你走这条路,一定要使用boto3 upload_fileupload_fileobj方法,因为它们将处理多部分上传和线程。
  • S3 性能影响,如 Request Rate and Performance Considerations 中所述
  • 关于python - Boto3 put_object() 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951308/

    相关文章:

    ElasticSearch - 获取字段值为 x 且该类型的最大日期低于 y 日期的文档

    elasticsearch - Confluent 5.4.0 ElasticSearch Sink连接器中没有连接器类型错误

    elasticsearch - 匹配无效的 Elasticsearch 日期范围

    ruby-on-rails - 使用 Rails 将文件上传到 AWS S3

    scala - Spark 应用程序conf中的setMaster与sparkSubmit上的--master标志之间的差异或冲突

    python - 如何获取当前文件目录的完整路径?

    python - 使用另一个数组中的 ID 对一个数组执行基于 ID 的平均 - NumPy

    javascript - 如果不包含特定单词,如何匹配正则表达式?

    python - (Cython) 在 __pow__ 中使模参数可选

    javascript - AWS SDK S3-如何在 putObject 方法中包含凭据