Нам нужно загрузить несколько больших файлов из S3 и сохранить их на локальном диске.Мы видим, что всякий раз, когда происходит загрузка, запускается GC.Во время GC отзывчивость системы уменьшается и увеличивает задержку некоторых вызовов в системе.Ниже приведен код, который мы используем для загрузки из облака.Максимум 8 потоков будут загружаться параллельно.Есть ли что-нибудь, что мы можем сделать более эффективно
final GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName,
key);
long startIndex = 0L;
long endIndex = maxBytesToReadPerSecond;
final long length = metadata.getContentLength();
final int bufferSize = 1024 * 10;
final byte[] buffer = new byte[bufferSize];
try (OutputStream output = new BufferedOutputStream(new FileOutputStream(destinationFile))) {
while (startIndex < length) {
this.rateLimiter.acquire(maxBytesToReadPerSecond);//throttles download
if (length - startIndex < maxBytesToReadPerSecond) {
getObjectRequest.setRange(startIndex);
} else {
getObjectRequest.setRange(startIndex, endIndex);
}
final S3Object s3Object = this.getS3Client().getObject(getObjectRequest);
int bytesRead = 0;
int bytesReadTotal = 0;
while ((bytesRead = s3Object.getObjectContent().read(buffer)) > -1) {
output.write(buffer, 0, bytesRead);
bytesReadTotal += bytesRead;
}
startIndex = startIndex + bytesReadTotal;
endIndex = (endIndex + maxBytesToReadPerSecond > length) ? length : endIndex + maxBytesToReadPerSecond;
}
}