10

У меня есть куча gzip-файлов, которые я должен время от времени конвертировать в bzip2. В настоящее время я использую сценарий оболочки, который просто 'gunzip' каждый файл, а затем 'bzip2 его. Хотя это работает, на завершение требуется много времени.

Можно ли сделать этот процесс более эффективным? Я готов совершить погружение и посмотреть исходные коды gunzip и bzip2, если это необходимо, но я просто хочу быть уверен в выигрыше. Есть ли надежда на повышение эффективности процесса?

7 ответов7

15

Интересно, а не gunzip в одном шаге и bzip2 в другом, было бы более эффективно использовать трубы. Что-то вроде gunzip --to-stdout foo.gz | bzip2 > foo.bz2

Я думаю, с двумя или более процессорами, это определенно будет быстрее. Но, возможно, даже с одним ядром. Я позорно признаюсь, что не испытал это, все же.

6

Параллельная GNU (http://www.gnu.org/software/parallel) может быть вариантом, если у вас несколько ядер (или даже несколько машин):

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"

Прочитайте учебник / справочную страницу для деталей и опций.

3

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

2

Иногда мне нужно делать то же самое с файлами журналов. Сначала я запускаю самые маленькие файлы * .gz (ls -rS), gunzip , а затем и bzip2 по отдельности. Я не знаю, можно ли направить выход gunzip непосредственно на вход bzip2. Команда bzip2 намного медленнее при сжатии, чем gunzip при распаковке, что может потреблять память и пространство подкачки на хосте.

Улучшения или предложения приветствуются. Вот мой единственный вкладыш:

for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done
1

Если у вас их несколько, прочитайте статью в ЖЖ с хорошим сценарием оболочки.

http://linuxgazette.net/123/bechtel.html

7zip получает лучшее сжатие, и является многопоточным.

1

Этот вопрос задавался давным-давно, когда pbzip2 либо не был доступен, либо не был способен сжимать из stdin, но теперь вы можете распараллеливать и распаковывать, и сжимать шаги, используя параллельный и pbzip2 (вместо bzip2):

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

что значительно быстрее, чем при использовании bzip2.

1

Просто пришлось сделать это несколько минут назад:

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

Где rezip будет определяться как:

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

При желании вы также можете сделать его многопоточным, используя опцию -P с xargs , но будьте осторожны с этим. (Начните с низкого!)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .