Сжатие форматов с хорошей поддержкой произвольного доступа в архивах? - PullRequest
51 голосов
/ 10 января 2009

Это похоже на предыдущий вопрос , но ответы там не удовлетворяют мои потребности, и мой вопрос немного отличается:

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

Но когда файлы сжимаются, все становится сложно. Недавно я узнал о параметре zlib Z_FULL_FLUSH, который можно использовать во время сжатия для вставки «точек синхронизации» в сжатый вывод (inflateSync() может затем начать чтение из различных точек в файле) , Это нормально, хотя файлы, которые у меня уже есть, нужно будет повторно сжать, чтобы добавить эту функцию (и странно, что gzip не имеет возможности для этого, но я готов написать свою собственную программу сжатия, если нужно).

Из одного источника кажется, что даже Z_FULL_FLUSH не является идеальным решением ... оно не только поддерживается не всеми архивами gzip, но сама идея обнаружения точек синхронизации в архивах может привести к ложные срабатывания (либо по совпадению с магическим числом для точек синхронизации, либо из-за того, что Z_SYNC_FLUSH также производит точки синхронизации, но их нельзя использовать для произвольного доступа).

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

Редактировать : Как я уже говорил, я хочу выполнить бинарный поиск в сжатых данных. Мне не нужно искать конкретную (несжатую) позицию - только искать с некоторой грубой детализацией в сжатом файле. Мне просто нужна поддержка для чего-то вроде «Распакуйте данные, начиная примерно с 50% (25%, 12,5% и т. Д.) Пути в этот сжатый файл».

Ответы [ 12 ]

0 голосов
/ 27 октября 2011

Я являюсь автором инструмента с открытым исходным кодом для сжатия определенного типа биологических данных. Этот инструмент, называемый starch, разделяет данные по хромосомам и использует эти подразделения в качестве индексов для быстрого доступа к сжатым блокам данных в большем архиве.

Данные по каждой хромосоме преобразуются для удаления избыточности в геномных координатах, а преобразованные данные сжимаются с помощью алгоритмов bzip2 или gzip. Смещения, метаданные и сжатые геномные данные объединяются в один файл.

Исходный код доступен с нашего GitHub сайта. Мы скомпилировали его под Linux и Mac OS X.

В вашем случае вы можете хранить (10 МБ или что-то еще) смещения в заголовке в произвольном формате архива. Вы анализируете заголовок, извлекаете смещения и постепенно fseek просматриваете файл на current_offset_sum + header_size.

0 голосов
/ 23 августа 2011

razip поддерживает произвольный доступ с лучшей производительностью, чем gzip / bzip2, который необходимо настроить для этой поддержки - уменьшая сжатие за счет «нормального» произвольного доступа:

http://sourceforge.net/projects/razip/

...