Произвольный доступ gzip поток

Я хотел бы смочь сделать произвольный доступ в gzipped файл. Я могу позволить себе сделать некоторую предварительную обработку на нем (скажите, создайте некоторый индекс), при условии, что результат предварительной обработки намного меньше, чем сам файл.

Совет?

Мои мысли были:

  • Взлом на существующей gzip реализации и сериализирует свой декомпрессор, указывает каждый, скажем, 1 мегабайт сжатых данных. Затем, чтобы сделать произвольный доступ, десериализуйте состояние декомпрессора и чтение от границы мегабайта. Это кажется твердым, тем более, что я работаю с Java, и я не мог найти чистый Java gzip реализацией :(
  • Повторно сожмите файл в блоках 1 МБ и сделайте то же как выше. Это имеет недостаток удвоения необходимого дискового пространства.
  • Запишите простой синтаксический анализатор gzip формата, который не делает никакой распаковки и только обнаруживает и индексирует границы блока (если даже существуют какие-либо блоки: Я еще не прочитал gzip описание формата),
12
задан hippietrail 10 May 2011 в 06:23
поделиться

3 ответа

Посмотрите по этой ссылке (пример кода C).

/* zran.c -- example of zlib/gzip stream indexing and random access
...

Gzip - это просто zlib с конвертом.

6
ответ дан 2 December 2019 в 22:22
поделиться

интересный вопрос. Я не понимаю, почему ваш второй вариант (повторное сжатие файла по частям) удвоит дисковое пространство. Мне кажется, все будет так же, за исключением небольших накладных расходов. Если у вас есть контроль над компрессионной частью, то это кажется правильной идеей.

Возможно, вы имеете в виду, что у вас нет контроля над вводом, и поэтому он удвоится.

Если вы можете это сделать, я представляю себе его моделирование как класс CompressedFileStream, который использует в качестве резервного хранилища серию блобов размером 1 МБ, сжатых с помощью gzip. При чтении Seek () в потоке переместится в соответствующий BLOB-объект и распакуется. Read () после конца большого двоичного объекта приведет к тому, что поток откроет следующий большой двоичный объект.

ps: GZIP описан в IETF RFC 1952 , но он использует DEFLATE для формата сжатия. Не было бы причин использовать разработку GZIP, если бы вы реализовали этот класс CompressedFileStream, как я его себе представлял.

0
ответ дан 2 December 2019 в 22:22
поделиться

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

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

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

4
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: