Подтвердить что ты не робот

Как я могу заархивировать файл без чтения всего его содержимого?

Я хочу подражать функциональности gzcat | tail -n.

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

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

4b9b3361

Ответ 1

Нет, вы не можете. Алгоритм zipping работает на потоках и адаптирует свои внутренние кодировки к тому, что содержит поток для достижения высокой степени сжатия.

Не зная, какое содержимое потока находится до определенной точки, невозможно узнать, как перейти от сжатия с этой точки.

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

Ответ 2

BGZF используется для создания сжатых BZ файлов с индексом gzip, созданных Samtools. Они доступны случайным образом.

http://samtools.sourceforge.net/

Ответ 3

Если у вас есть контроль над тем, что входит в файл в первую очередь, если он что-то вроде файла ZIP, вы можете хранить куски заданного размера с именами файлов в порядке возрастания и затем просто распаковывать последний фрагмент/файл.

Ответ 4

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

Bzip2 использует схему сжатия блоков. Таким образом, если вы берете кусок конца вашего файла, который, как вы уверены, достаточно велик, чтобы содержать весь последний фрагмент, вы можете восстановить его с помощью bzip2recover.

Размер блока можно выбрать во время записи файла. Фактически это происходит, когда вы устанавливаете -1 (или --fast) в -9 (или --best) в качестве параметров сжатия, которые соответствуют размерам блоков от 100 к до 900 тыс. Значение по умолчанию - 900 000.

Инструменты командной строки bzip2 не дают вам приятного дружественного способа сделать это с помощью конвейера, но тогда bzip2 не ориентирован на потоки, возможно, это не удивительно.

Ответ 5

zindex создает и запрашивает индекс в сжатом текстовом текстовом файле в режиме времени и пространства.

https://github.com/mattgodbolt/zindex

Ответ 6

Примером полностью gzip-совместимого формата псевдослучайного доступа является dictzip:

Для сжатия файл делится на "порции" данных, каждый из которых составляет менее 64 КБ. [...]

Для произвольного доступа к данным смещение и длина данных предоставляются библиотечным процедурам. Эти подпрограммы определяют блок, в котором начинаются нужные данные, и распаковывают этот блок. Последовательные куски распаковываются по мере необходимости ".

Ответ 7

Что ж, вы можете сделать это, если ранее создавали индекс для каждого файла...

Я разработал инструмент командной строки, который создает индексы для файлов gzip, которые обеспечивают очень быстрый произвольный доступ внутри них, и делает это с чередованием действий (извлечение, хвост, непрерывный хвост и т.д.): https://github.com/circulosmeos/gztool

Но вы можете сделать хвост (-t), и индекс будет создан автоматически: если вы собираетесь сделать то же самое в будущем, это будет намного быстрее, и в любом случае в первый раз это займет то же время, что и gunzip | tail:

$ gztool -t my_file.gz