Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过流媒体将多部分文件上载到Amazon S3时内存使用率高?_Java_Spring_Amazon S3_File Upload_Kubernetes - Fatal编程技术网

Java 通过流媒体将多部分文件上载到Amazon S3时内存使用率高?

Java 通过流媒体将多部分文件上载到Amazon S3时内存使用率高?,java,spring,amazon-s3,file-upload,kubernetes,Java,Spring,Amazon S3,File Upload,Kubernetes,在我的JavaSpring应用程序中,下面的方法直接将文件流式传输并上传到AmazonS3存储桶。我已经研究过,使用流将使上传大文件(我的用例中大于100MB的视频)的内存效率更高。使用25MB文件测试该方法时,我的Java Spring应用程序在Kubernetes集群设置中的内存使用量增加了200MB!我还尝试了一个200MB的文件,内存再次增加到~2GB。没有引发内存不足异常,但内存使用率不会下降。为什么会发生这种情况 public void uploadFile(MultipartFil

在我的JavaSpring应用程序中,下面的方法直接将文件流式传输并上传到AmazonS3存储桶。我已经研究过,使用流将使上传大文件(我的用例中大于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
        }
    }

有多种方法可以处理大型文件上载

  • 使用后台任务将字节数组写入磁盘并上载到S3 也许吧
  • 存储在内存中并直接上载对象(错误 选项,除非您设置了非常低的文件上载限制)
  • 看看git回购如何实现上述方法


    我在这里看不到您的用例。但是如果你正在处理UI,也可以考虑使用.t/p>直接从UI上传文件。谢谢你参考我的Git RePO。它帮助我回答了很多问题。我可能会使用预先签名的S3URL路由:)您应该将stream.close()放在finally块中。祝您今天过得愉快!请看一下我的答案,它使用S3OutputStream,如果流太大,它会自动切换到多部分上传。当前使用10MB的缓冲区,但可以将其配置为更小/更大。