Произвольный доступ к многочастному файлу gzip (на Java)

StackOverflow https://stackoverflow.com/questions/1225375

Вопрос

Это может относиться к категории «не совсем осуществимо» или «не стоит затрачиваемых усилий», но вот так.

Я пытаюсь получить произвольный доступ к записям, хранящимся в файле gzip, состоящем из нескольких частей.В частности, интересующие меня файлы сжаты. Херетрикс Файлы дуг.(Если вы не знакомы с файлами gzip, состоящими из нескольких частей, спецификация gzip позволяет объединить несколько потоков gzip в один файл gzip.Они не передают никакой словарной информации, это простое двоичное добавление.)

Я думаю, что это можно сделать, найдя определенное смещение внутри файла, а затем просканировав байты магического заголовка gzip (т.0x1f8b, согласно RFC) и попытайтесь прочитать поток gzip из следующих байтов.Проблема с этим подходом заключается в том, что те же байты могут появляться и внутри реальных данных, поэтому поиск этих байтов может привести к неправильной позиции для начала чтения потока gzip.Есть ли лучший способ справиться с произвольным доступом, учитывая, что смещения записей заранее неизвестны?

Это было полезно?

Решение

Как вы поняли, конструкция GZIP не поддерживает произвольный доступ.

Можно сделать так, как вы описываете, а потом, если столкнетесь с ошибкой в ​​декомпрессоре, сделать вывод, что найденная вами сигнатура на самом деле является сжатыми данными.
Если вы закончите распаковку, то легко проверить достоверность только что распакованного потока с помощью CRC32.

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

Это будет достаточно быстро для файлов размером менее 100 КБ.Примерно так: если бы у вас было 10 файлов размером около 100 КБ каждый, на современном процессоре это, вероятно, было бы сделано за 2 секунды.Вот что я имею в виду под «довольно быстро».Но только вы знаете требования к производительности вашего приложения.

У вас есть класс GZipInputStream?Если да, то вы уже на полпути.

Другие советы

Формат файла BGZF , совместимый с GZIP, был разработан биологами.

  

(...) Преимущество   BGZF по сравнению с обычным GZIP является то, что   BGZF позволяет искать, не имея   сканировать весь файл до   искомая позиция.

В http: / /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ , ознакомьтесь с BlockCompressedOutputStream и BlockCompressedInputStream.java

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top