Но можно получить эффективность bzip2, при этом существенно увеличив скорость. Речь идёт об утилите pbzip2 — Parallel BZIP2. В обычном случае при использовании bzip2 задействуется только одно процессорное ядро, в то время как на современных системах их может быть 2, 4, или, например, 8.
Pbzip2 может использовать сразу несколько процессорных ядер, что приводит, по заявлению авторов, к почти линейному увеличению производительности. Сжатые файлы, которые создаёт pbzip2, полностью совместимы с bzip2 1.0.2 и более новыми версиями bzip2.
Ниже результат тестирования скорости сжатия участка SQL-файла размером 1000M (dd if=dump.sql of=testfile bs=1M count=1000) на компьютере с двумя процессорами Intel Xeon E5520 (4 ядра, 8 потоков, тактовая частота 2,26 ГГц):
Как видно из результатов тестирования, pbzip2, работающий в 4 потока, приблизительно в 3,6 раз быстрее, чем bzip2, работающий в один поток — что действительно является почти линейным увеличением производительности.
При этом pbzip2, работающий в 16 потоков, оказался медленнее, чем pbzip2, использующий 4 потока — вероятно, из-за скорости выполнения операций ввода/вывода.
Используется pbzip2 примерно так же, как и просто bzip2, но есть некоторые дополнительные функции, например вывод прогресса выполнения операции в процентах.
Чтобы сжать файл:
pbzip2 -k -p4 filename
Где filename — имя файла. По умолчанию сжатый файл называется так же, как исходник, но в конце добавляется .bz2 (то есть в данном случае filename.bz2).
Опция -k нужна для того, чтобы pbzip2 не удалял исходник после того, как закончит сжатие. Можно также добавить опцию -v, для того, чтобы выводилась подробная информация, в том числе прогресс выполнения операции в процентах.
Опция -p устанавливает количество потоков (в данном случае 4).
Чтобы распаковать файл:
pbzip2 -dk -p4 filename.bz2
Где filename.bz2 — имя файла. По умолчанию распакованный файл называется так же, как сжатый, но в конце убирается .bz2 (то есть в данном случае filename).
Опция -d нужна для того, чтобы произвести декомпрессию (decompress).
Соответственно, вместе с выводом подробной информации и прогресса выполнения операции сжатие будет выглядеть так:
pbzip2 -kv -p4 filename
А распаковать файл можно так:
pbzip2 -dkv -p4 filename.bz2
Если требуется сжать целую директорию, то, как и в случае с gzip и bzip2, делается так называемый тарболл (который сам по себе не имеет сжатия), содержащий нужную директорию, и он сжимается нужной утилитой.
В случае с pbzip2 сделать это в одну строку можно так:
tar cf myfile.tar.bz2 --use-compress-prog=pbzip2 directory_to_compress/
Или так:
tar -c directory_to_compress/ | pbzip2 -c > myfile.tar.bz2
Во втором случае, соответственно, можно также добавить -p4 (чтобы установить количество потоков, равное 4).