Чтение последних строк сжатого текстового файла - PullRequest
14 голосов
/ 26 июля 2010

Допустим, file.txt.gz имеет 2 ГБ, и я хочу увидеть последние 100 строк или около того.zcat <file.txt.gz | tail -n 100 прошел бы через все это.

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

Если я правильно понимаю, gzip stream - это простой поток команд, описывающих, что выводить, - с ним должна быть возможность синхронизации.Затем имеется скользящее окно 32 КБ для самых последних несжатых данных - которое начинается как мусор, конечно, если мы начнем с середины, но я предполагаю, что обычно оно быстро заполняется реальными данными, и с этого момента декомпрессия тривиальна (ну,возможно, что что-то перезаписывается снова и снова от начала файла до конца, и поэтому скользящее окно никогда не очищается - меня удивило бы, если бы это было так часто - и если это произойдет, мы просто обработаем весь файл).

Я не очень-то стремлюсь сам сделать этот род gzip-хакерства - никто не делал этого раньше, для работы с поврежденными файлами, если ничего больше?

В качестве альтернативы - если gzip действительно не может сделатьчто, возможно, есть какие-нибудь другие программы сжатия потоков, которые работают почти так же, как они, за исключением того, что они позволяют повторную синхронизацию в среднем потоке?печатать возраст байтов в скользящем окне.Оказывается, что вещи действительно копируются снова и снова, и даже после 5 МБ + скользящее окно все еще содержит материал из первых 100 байтов и из случайных мест по всему файлу.

Мы даже не можем обойти эточитая первые несколько блоков и последние несколько блоков, поскольку эти первые байты не имеют прямой ссылки, это просто очень длинная цепочка копий, и единственный способ выяснить, на что она ссылается, - это обработать все это.

По сути, с опциями по умолчанию то, что я хотел, вероятно, невозможно.

С другой стороны, у zlib есть опция Z_FULL_FLUSH, которая очищает это скользящее окно для синхронизации.Так что вопрос все еще стоит.Предполагая, что zlib время от времени синхронизируется, есть ли какие-нибудь инструменты для чтения только до конца, без обработки всего этого?

Ответы [ 2 ]

1 голос
/ 28 июля 2010

Z_FULL_FLUSH испускает известную последовательность байтов (00 00 FF FF), которую вы можете использовать для синхронизации. Эта ссылка может быть полезна.

0 голосов
/ 28 июля 2010

Это разница между блочными и потоковыми шифрами.Поскольку gzip является потоковым шифром, вам может понадобиться весь файл до определенной точки, чтобы расшифровать байты в этой точке.

Как вы упоминаете, когда окно очищено, вы получаете золотой цвет.Но нет никакой гарантии, что zlib действительно делает это достаточно часто для вас ... Я предлагаю вам искать назад от конца файла и найти маркер для полного сброса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...