Estoy intentando cargar un archivo en AWS S3 mediante el uso de la API de Java-AWS. El problema es que mi aplicación no puede cargar archivos de gran tamaño debido a la pila está llegando a su límite. Error: espacio de almacenamiento dinámico de Java: java.lang.OutOfMemoryError
Yo personalmente creo que se extiende la pila de memoria no es una solución permanente porque tengo que cargar el archivo hasta 100 gb. Qué tengo que hacer ?
Aquí está el fragmento 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));
Recomiendo fuertemente que setContentLength()
el ObjectMetadata
, ya que:
..Si no se proporciona, la biblioteca tendrá que amortiguar el contenido del flujo de entrada para el cálculo de la misma.
(..Which previsiblemente dará lugar a OutOfMemory de archivos "grandes" suficientes.)
fuente: javadoc PutObjectRequest
Aplicado a su 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));
// ...