Ответ 1
Посмотрите по этой ссылке (пример кода на C).
/* zran.c -- example of zlib/gzip stream indexing and random access
...
Gzip - это просто zlib с огибающей.
Я хотел бы иметь возможность делать произвольный доступ в gzip файл. Я могу позволить себе сделать некоторую предварительную обработку (например, построить какой-то индекс), при условии, что результат предварительной обработки намного меньше, чем сам файл.
Любые советы?
Мои мысли были:
Посмотрите по этой ссылке (пример кода на C).
/* zran.c -- example of zlib/gzip stream indexing and random access
...
Gzip - это просто zlib с огибающей.
Формат файла BGZF, совместимый с GZIP, был разработан биологами.
(...) Преимущество BGZF над обычным gzip - это то, что BGZF позволяет искать, не имея для сканирования всего файла до поиск позиции.
В http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/, посмотрите на BlockCompressedOutputStream и BlockCompressedInputStream.java
интересный вопрос. Я не понимаю, почему ваш второй вариант (recompress file in chunks) удваивает дисковое пространство. Кажется, что это будет одно и то же, меньше небольшого количества накладных расходов. Если у вас есть контроль над частью сжатия, тогда это кажется правильной идеей.
Возможно, вы имеете в виду, что у вас нет контроля над входом, и поэтому он будет удвоен.
Если вы можете это сделать, я представляю себе его моделирование как класс CompressedFileStream, который использует в качестве своего резервного хранилища серию 1mb gzip'd blobs. При чтении Seek() в потоке переместится к соответствующему блобу и распакуется. Прочитайте() после конца blob, чтобы поток открыл следующий blob.
ps: GZIP описан в IETF RFC 1952, но он использует DEFLATE для формата сжатия. Не было бы причин использовать разработку GZIP, если бы вы реализовали этот класс CompressedFileStream, как я себе представлял.
FWIW: я разработал инструмент командной строки на основе исходного кода zlib zran.c, который создает индексы для файлов gzip: https://github.com/circulosmeos/gztool
Он может даже создать индекс для все еще растущего файла gzip (например, журнала, созданного rsyslog непосредственно в формате gzip), тем самым уменьшая на практике время создания индекса. Смотрите -S
(Supervise).