Чтение последних строк gzipped текстового файла

Скажем, file.txt.gz имеет 2 ГБ, и я хочу видеть 100 строк в последний раз или около этого. zcat прошел бы все это.

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

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

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

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

Править: Я нашел чистое переопределение Ruby zlib и взломал его для печати возрастов байтов в раздвижном окне. Оказывается, что вещи действительно становятся скопированными много раз много и даже после 5 МБ +, раздвижное окно все еще содержит материал от первых 100 байтов, и от случайных мест всюду по файлу.

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

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

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

14
задан ndim 15 April 2011 в 22:44
поделиться

2 ответа

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

1
ответ дан 1 December 2019 в 16:59
поделиться

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

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

0
ответ дан 1 December 2019 в 16:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: