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