Чтение объекта AWS S3 GZIP с использованием GetObjectRequest с диапазоном - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь прочитать большой AWS S3 сжатый объект (gz). Я не хочу читать весь объект, хочу читать его по частям, чтобы я мог обрабатывать несжатые данные параллельно. читая его с помощью GetObjectRequest с заголовком «Range», где я устанавливаю диапазон байтов. Однако, когда я даю диапазон байтов между (100 200), он терпит неудачу с "Не в формате GZIP" Причина отказа в том, что запрос AWS возвращает поток, однако, когда я анализирую его до GZIPInputStream, он терпит неудачу как "GZIPInputStream" ожидает, что первый байт (GZIP_MAGI C = 0x8b1f) подтвердит, что это gzip, которого нет в потоке.

   GetObjectRequest rangeObjectRequest = new GetObjectRequest(<<Bucket>>, <<Key>>).withRange(100, 200);
   S3Object object = s3Client.getObject(rangeObjectRequest);
   S3ObjectInputStream rawData = object.getObjectContent();
   InputStream data =  new GZIPInputStream(rawData);

Может ли кто-нибудь указать правильный подход?

1 Ответ

1 голос
/ 28 мая 2020

GZIP - это формат сжатия, в котором каждый байт в файле зависит от всех байтов, предшествующих ему. Это означает, что вы не можете выбрать произвольный диапазон байтов из файла и разобраться в нем.

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

Вы также можете создать свой собственный формат хранения файлов, в котором фрагменты файла будут храниться в виде отдельно сжатых блоков. Вы можете сделать это, используя формат ZIP, где каждый файл в архиве представляет собой определенный размер блока c. Но для того, чтобы это работало, вам потребуется реализовать собственный ридер ZIP-каталогов.

...