2009-08-04 5 views
5

Это может упасть в область «не реально выполнимо» или «не стоит усилий», но здесь.Многопользовательский доступ к произвольному произвольному файлу gzip (на Java)

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

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

ответ

1

Дизайн GZIP, как вы поняли, не относится к случайному доступу.

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

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

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

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

1

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

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

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