Это похоже на предыдущий вопрос , но ответы там не удовлетворяют мои потребности, и мой вопрос немного отличается:
В настоящее время я использую сжатие gzip для некоторых очень больших файлов, которые содержат отсортированные данные. Если файлы не сжаты, бинарный поиск - это удобный и эффективный способ поддержки поиска местоположения в отсортированных данных.
Но когда файлы сжимаются, все становится сложно. Недавно я узнал о параметре zlib Z_FULL_FLUSH
, который можно использовать во время сжатия для вставки «точек синхронизации» в сжатый вывод (inflateSync()
может затем начать чтение из различных точек в файле) , Это нормально, хотя файлы, которые у меня уже есть, нужно будет повторно сжать, чтобы добавить эту функцию (и странно, что gzip
не имеет возможности для этого, но я готов написать свою собственную программу сжатия, если нужно).
Из одного источника кажется, что даже Z_FULL_FLUSH
не является идеальным решением ... оно не только поддерживается не всеми архивами gzip, но сама идея обнаружения точек синхронизации в архивах может привести к ложные срабатывания (либо по совпадению с магическим числом для точек синхронизации, либо из-за того, что Z_SYNC_FLUSH
также производит точки синхронизации, но их нельзя использовать для произвольного доступа).
Есть ли лучшее решение? Я хотел бы избежать вспомогательных файлов для индексации, если это возможно, и явная поддержка по умолчанию для квазислучайного доступа была бы полезной (даже если она крупнозернистая - например, возможность начать чтение с каждым интервалом 10 МБ). Есть ли другой формат сжатия с лучшей поддержкой случайного чтения, чем gzip?
Редактировать : Как я уже говорил, я хочу выполнить бинарный поиск в сжатых данных. Мне не нужно искать конкретную (несжатую) позицию - только искать с некоторой грубой детализацией в сжатом файле. Мне просто нужна поддержка для чего-то вроде «Распакуйте данные, начиная примерно с 50% (25%, 12,5% и т. Д.) Пути в этот сжатый файл».