ウィッキーメモン:
私は、Java-AWSのAPIを使って、AWS S3にファイルをアップロードしようとしています。問題は、私のアプリケーションは、ヒープが限界に達しているため、大きなサイズのファイルをアップロードすることができませんです。エラー:java.lang.OutOfMemoryErrorを:Javaヒープスペース
私は個人的に、私は100ギガバイト点で最大のファイルをアップロードする必要があるため、ヒープメモリを拡張すると、恒久的な解決策ではないと思います。私は何をすべきか ?
ここでは、コードスニペットは、次のとおりです。
BasicAWSCredentials awsCreds = new BasicAWSCredentials(AID, Akey);
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(Regions.fromName("us-east-2"))
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.build();
InputStream Is=file.getInputStream();
boolean buckflag = s3Client.doesBucketExist(ABuck);
if(buckflag != true){
s3Client.createBucket(ABuck);
}
s3Client.putObject(new PutObjectRequest(ABuck, AFkey,file.getInputStream(),new ObjectMetadata() ).withCannedAcl(CannedAccessControlList.PublicRead));
xerx593:
私は強くにお勧めsetContentLength()
のObjectMetadata
ことから、:
..If提供されない、ライブラリがする必要がありますバッファ、それを計算するために、入力ストリームの内容を。
(..which予想通り「十分大きな」ファイル上のOutOfMemoryにつながります。)
あなたのコードに適用されます:
// ...
ObjectMetadata omd = new ObjectMetadata();
// a tiny code line, but with a "huge" information gain and memory saving!;)
omd.setContentLength(file.length());
s3Client.putObject(new PutObjectRequest(ABuck, AFkey, file.getInputStream(), omd).withCannedAcl(CannedAccessControlList.PublicRead));
// ...