Eu estou tentando fazer upload de um arquivo no AWS S3 usando Java AWS API. O problema é a minha candidatura é incapaz de fazer upload de grandes arquivos de tamanho porque a pilha está atingindo seu limite. Erro: espaço de pilha Java: java.lang.OutOfMemoryError
Eu pessoalmente acho que se estende memória heap não é uma solução permanente porque eu tenho que fazer o upload de arquivos até 100 gb. O que devo fazer ?
Aqui está o trecho de código:
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));
Eu recomendo fortemente que setContentLength()
no ObjectMetadata
, uma vez que:
..Se não fornecida, a biblioteca terá para tamponar o conteúdo do fluxo de entrada, a fim de calcular.
(..Que previsivelmente vai levar a OutOfMemory em "suficientes grandes" arquivos.)
fonte: javadoc PutObjectRequest
Aplicado ao seu código:
// ...
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));
// ...