【问题标题】:High memory usage when uploading a multipart file to Amazon S3 via streaming?通过流式传输将多部分文件上传到 Amazon S3 时内存使用率高?
【发布时间】:2020-02-03 08:27:42
【问题描述】:

我的 Java Spring 应用程序中的以下方法直接将文件流式传输并上传到 Amazon S3 存储桶。我研究过,使用流可以使上传大文件(对于我的用例> 100MB 视频)更有效率。在使用 25MB 文件测试该方法时,我的 Java Spring 应用程序在 Kubernetes 集群设置中的内存使用量猛增了 200MB!我还尝试了一个 200MB 的文件,内存再次飙升至 ~2GB。没有抛出内存不足异常,但内存使用量没有下降。为什么会这样?

public void uploadFile(MultipartFile file, String saveFileName) {
        try {
            ObjectMetadata metadata = new ObjectMetadata();

            if (file.getContentType() != null){
                om.setContentType(file.getContentType());
            }

            metadata.setContentLength(file.getSize());

            saveFileName = saveFileName.replaceAll(" ", "");

            InputStream stream = file.getInputStream();

            PutObjectRequest request = new PutObjectRequest(bucketName, saveFileName, stream, metadata);
            request = request.withMetadata(om);

            s3client.putObject(request);

            stream.close();
        } catch (AmazonClientException | IOException exception) {
            // handle exception
        }
    }

【问题讨论】:

  • 你应该把 stream.close() 放在 finally 块中。祝你有美好的一天!
  • 请看我的回答 stackoverflow.com/a/64263423/1704634 ,它使用 S3OutputStream 自动切换到分段上传,以防流太大。当前使用 10MB 缓冲区,但这可以配置得更小/更大。

标签: java spring amazon-s3 file-upload kubernetes


【解决方案1】:

有多种方法可以处理大文件上传。

  1. 使用后台任务将字节数组写入磁盘并上传到 S3 也许吧。
  2. 存储在内存中,直接上传对象(坏坏 选项,除非您设置非常低的文件上传限制)

看看thisgit repo 上面的方法是如何实现的

我在这里看不到您的用例。但是,如果您还要处理 UI,请考虑使用 pre-signed S3 URLs 直接从 UI 上传文件。

【讨论】:

  • 感谢您将我推荐给这个 git repo。它帮助回答了我的很多问题。我可能会使用预签名的 s3 URL 路由:)
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多