Java Heap Space недостаточно для загрузки файлов на AWS S3 - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь загрузить файл на AWS S3 с помощью API Java-AWS. Проблема в том, что мое приложение не может загружать файлы большого размера, потому что куча достигает своего предела. Ошибка: 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));

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Я настоятельно рекомендую setContentLength() на ObjectMetadata, так как:

.. Если не предоставлено, библиотека должна будет буферизовать содержимое входного потока для его вычисления.

(.. что, как и ожидалось, приведет к 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));
 // ...
0 голосов
/ 26 января 2019

Вам нужно добавить пример кода, чтобы получить правильный ответ. Если вы имеете дело с большим объектом, используйте TransferManager для загрузки, а не putObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...