Java Heap O espaço é insuficiente para fazer upload de arquivos na AWS S3

Wicky Memon:

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));
xerx593:

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

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=202948&siteId=1
Recomendado
Clasificación