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