Javaヒープスペースは、AWS S3にファイルをアップロードするには不十分です

ウィッキーメモン:

私は、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につながります。)

ソース:PutObjectRequestのJavaDoc

あなたのコードに適用されます:

 // ...
 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));
 // ...

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=202949&siteId=1