У меня есть Java-приложение, которое извлекает сжатие нескольких объектов на S3 посредством потоковой передачи. Таким образом, чтобы сделать его более эффективным, приложение не загружает объекты на локальный диск и не загружает их снова, а передает потоки файлов по 5 МБ и сжимает их на лету. Задача, с которой я сталкиваюсь, заключается в том, чтобы обеспечить прогресс в этой операции, мне нужно полагаться на общий размер всех объектов и использовать счетчик, чтобы увидеть, сколько из общего размера обрабатывается в качестве источника для вычисления прогресса.
Задача, с которой я столкнулся, заключается в том, чтобы получить размер объектов, мне нужно сначала пройтись по всем объектам, получить размер один за другим и вычислить общее количество перед запуском процесса. Однако это будет слишком медленно, поскольку могут быть миллионы объектов, что означает миллионы вызовов API. Если я попытаюсь вычислить размер перед запуском сжатия, этот процесс вычисления займет больше, чем фактическое сжатие, и это разрушит всю цель. Поэтому мне было интересно, есть ли способ передать список объектов с помощью одного вызова API и получить общий размер. Я знаю, что есть способ добавить префикс и получить соответствие префикса для всех объектов, которые соответствуют префиксу, но поскольку объекты могут храниться с разными префиксами, этот подход не будет работать.
Следующий фрагмент кодаВот как я могу получить размер объекта один за другим:
public Long getObjectSize(AmazonS3Client amazonS3Client, String bucket, String key)
throws IOException {
return amazonS3Client.getObjectMetadata(bucket, key).getContentLength();
}
ПРИМЕЧАНИЕ. Если бы я полагался на количество объектов для расчета прогресса, это было бы не совсем точно. Некоторые объекты имеют размер 2-3 КБ, а некоторые довольно большие (1-2 ГБ).