Я хотел бы смочь сделать произвольный доступ в gzipped файл. Я могу позволить себе сделать некоторую предварительную обработку на нем (скажите, создайте некоторый индекс), при условии, что результат предварительной обработки намного меньше, чем сам файл.
Совет?
Мои мысли были:
Посмотрите по этой ссылке (пример кода C).
/* zran.c -- example of zlib/gzip stream indexing and random access
...
Gzip - это просто zlib с конвертом.
интересный вопрос. Я не понимаю, почему ваш второй вариант (повторное сжатие файла по частям) удвоит дисковое пространство. Мне кажется, все будет так же, за исключением небольших накладных расходов. Если у вас есть контроль над компрессионной частью, то это кажется правильной идеей.
Возможно, вы имеете в виду, что у вас нет контроля над вводом, и поэтому он удвоится.
Если вы можете это сделать, я представляю себе его моделирование как класс CompressedFileStream, который использует в качестве резервного хранилища серию блобов размером 1 МБ, сжатых с помощью gzip. При чтении Seek () в потоке переместится в соответствующий BLOB-объект и распакуется. Read () после конца большого двоичного объекта приведет к тому, что поток откроет следующий большой двоичный объект.
ps: GZIP описан в IETF RFC 1952 , но он использует DEFLATE для формата сжатия. Не было бы причин использовать разработку GZIP, если бы вы реализовали этот класс CompressedFileStream, как я его себе представлял.
Формат файла BGZF , совместимый с GZIP, был разработан биологами.
(...) Преимущество BGZF перед обычным gzip заключается в том, что BGZF позволяет выполнять поиск без необходимости сканировать весь файл до {{1} } искомую позицию.
В http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ посмотрите на BlockCompressedOutputStream и BlockCompressedInputStream.java