IOUtils.copy () с потоками ввода и вывода очень медленно - PullRequest
0 голосов
/ 23 ноября 2018

Как часть моего веб-сервиса, у меня есть хранилище изображений, которое получает изображение из Amazon S3 (хранилище данных), а затем возвращает его.Вот как выглядит метод, который делает это:

File getPicture(String path) throws IOException {
    File file = File.createTempFile(path, ".png");
    S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, path));
    IOUtils.copy(object.getObjectContent(), new FileOutputStream(file));
    return file;
}

Проблема в том, что получение ответа от службы занимает слишком много времени (для загрузки образа размером 3 МБ потребовалось 7,5 секунды).Я замечаю, что если я закомментирую строку IOUtils.copy (), время отклика будет значительно быстрее, поэтому именно этот метод должен вызывать эту задержку.

Я видел этот метод, используемый почти во всех современных примерах преобразования объекта S3Object в файл, но мне кажется, что это уникальный случай.Неужели я здесь упускаю трюк?

Ценю любую помощь!

1 Ответ

0 голосов
/ 23 ноября 2018

Из документации AWS:

public S3Object getObject(GetObjectRequest getObjectRequest)

возвращенный объект Amazon S3 содержит прямой поток данных из HTTP-соединения.Базовое HTTP-соединение не может быть повторно использовано, пока пользователь не закончит чтение данных и не закроет поток.

public S3ObjectInputStream getObjectContent()

Примечание. Методэто простой метод получения и фактически не создает поток.Если вы извлекаете S3Object, вы должны как можно скорее закрыть этот входной поток, поскольку содержимое объекта не буферизуется в памяти и не передается непосредственно из Amazon S3.


Если вы удалитеIOUtils.copy, метод быстро завершается, потому что вы на самом деле не обрабатываете поток.Если файл большой, его загрузка займет некоторое время.Вы не сможете ничего с этим поделать, если не сможете лучше подключиться к сервисам AWS.

...