首页 > 解决方案 > 使用 AWS SDK for Java 2.x 将大文件上传到 S3 时内存不足

问题描述

我有一个 Java 11 Coretto lambda 函数,我从 S3 下载文件,压缩它们并将 zip 文件上传到另一个 S3 存储桶。这适用于使用TransferManager的 AWS SDK 1.X ,但我试图不在我的项目中混合 V1 和 V2 AWS JAVA SDK 以保持干净并最大限度地减少依赖关系。

使用 V2 S3Client ( software.amazon.awssdk.services.s3 ) 并执行大型 zip 文件的putObject时,即使我提供 InputStream 并设置contentLength,我也会收到 OutOfMemory 错误,我认为这已经足够了以防止在开始上传之前将整个 zip 文件加载到内存中。

这是我在尝试上传大型 zip 文件(几场演出)时导致 OutOfMemory 错误的代码:

InputStream targetStream = new FileInputStream(zipFile);

PutObjectRequest request = PutObjectRequest.builder()
        .bucket(zipBucket)
        .key(zipFile.getName())
        .contentType("application/zip")
        .contentLength(zipFile.length())
        .expires(expiration.toInstant()).build();

s3Client.putObject(request, RequestBody.fromInputStream(targetStream, zipFile.length()));

我究竟做错了什么?

标签: javaamazon-s3aws-lambda

解决方案


推荐阅读