Как удалить первую строку из файла gzip без распаковки? - PullRequest
2 голосов
/ 28 февраля 2020

У меня большой gzip файл, который медленно распаковывается. Как удалить первую строку на месте, не распаковывая весь файл?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2020

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

Поэтому я считаю, что ответ: не .

Рассматривая детали реализации алгоритма zip (точнее, алгоритма сжатия Lempel Ziv), вы обнаружите, что существуют данные windows определенных размеров.
Максимальная длина поступающих данных который может быть распакован, определяется размером окна «впереди». Существует также максимальное расстояние, на котором данные могут использоваться для поиска среди уже распакованных данных, - «заднее» окно.
Следовательно, может быть возможно распаковать только часть сжатых данных, достаточно большую, чтобы убедиться, что остальные сжатые данные не ссылаются ни на что до этого. Т.е. настолько велик, что с определенной точки в сжатых данных больше нет ссылок на то, что вы собираетесь удалить. Затем вы можете повторно сжать эту часть без первой строки, от которой хотите избавиться.

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

Так что я думаю, что я останусь с: Нет.

Или, по крайней мере:
Вам придется по-настоящему изучить алгоритм Zip до такой степени, что вы сможете сами его реализовать. Затем узнайте еще больше о точной реализации алгоритма в файле, с которым вы имеете дело. Затем узнайте о точной конфигурации компрессии, которую вы смотрите (размеры двух windows).
Затем потратьте много усилий.

Рассмотрим детали того, насколько точно это сделать. за ответом здесь.

1 голос
/ 05 марта 2020

За исключением очень особых случаев, вам нужно будет распаковать, применить изменения и повторно сжать содержимое. Тем не менее, это может быть сделано в потоковом режиме, поэтому вам не нужно помещать распакованную версию в хранилище.

В среде оболочки Unix это обычно делается с помощью конвейера и может быть выполнено с помощью этого script:

zcat input.gz | tail -n +2 | gzip > output.gz

Это займет некоторое время, но не превысит объем вашего хранилища только потому, что распакованная версия файла слишком велика.

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