병렬 bzip2와 gzip을 기본적으로 사용하는 가장 좋은 방법은 무엇입니까?


41

많은 컴퓨터에 둘 이상의 코어가 있지만 Bzip2 및 gzip은 하나의 코어 만 사용합니다. 그러나 lbzip2, pbzip2 및 pigz와 같은 프로그램이 있으며 사용 가능한 모든 코어를 사용하고 bzip2 및 gzip과 호환됩니다.

그렇다면 기본적으로 이러한 프로그램을 사용하는 가장 좋은 방법은 무엇 tar cfa file.tar.bz2 directory입니까? 그래서 bzip2 대신 lbzip2 / pbzip2 를 사용합니까? 물론 나는 아무것도 깨고 싶지 않습니다.


2
모든 사람에게 호기심 : 병렬 gzip / bzip이 실제로 직렬보다 빠릅니까? 나는 hdd 기록 속도와 다른 구속 조건이 더 문제가된다고 생각한다.
con-f-use

@ con-f-use 이론적으로 SSD가 없다면 아카이브의 전체 크기가 증가함에 따라 더 빠를 수 있습니다.
Marco Ceppi

1
CPU가 16 개인 시스템에서 gzip에서 pigz로 전환하면 시간이 1.2TB로 단축되고 네트워크를 통해 전송되어 18 시간 백업 및 14 시간 테스트에서 4 시간 백업 및 2 시간 테스트로 결과를 테스트합니다. 잠재적 인 병목 현상, 디스크 속도, 네트워크 속도, 처리 능력이 많이 있지만이 경우에는 IO 바인딩보다 CPU 바인딩이 분명했습니다. 고급 시스템이므로 결과가 다를 수 있습니다. 중요하지는 않지만 RHEL6에 있습니다
cs_alumnus

답변:


32

bzip2, bunzip2 및 bzcat을 lbzip2로, gzip, gunzip, gzcat 및 zcat을 pigz로 symlink 할 수 있습니다.

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

/usr/share/doc/lbzip2/README.gz가 /usr/share/doc/pbzip2/README.gz보다 "더욱"보기 때문에 pbzip2 대신 lbzip2를 선택했습니다. 또한 tar 매뉴얼 은 lbzip2에 대해 설명 합니다.

편집하다:

Precise Pangolin에 포함 된 pigz-2.1.6은 알 수없는 접미사 (예 : initramfs-*. img)가있는 파일의 압축 풀기를 거부합니다. 이것은 Quantal과 함께 제공되는 pigz-2.2.4에서 수정되었습니다. 따라서 Quantal까지 기다리 거나 Quantal 패키지를 수동으로 설치 하거나 gunzip / gzcat / zcat을 아직 연결하지 않을 수 있습니다.


7
이는 대부분의 사람들의 $ PATH에서 / usr / local / bin /이 / bin / 앞에 있기 때문에 효과적입니다. 무언가가 / bin / gunzip을 직접 호출하거나 누군가가 $ PATH에 / bin을 먼저 가지고 있으면 pigz를 사용하지 않습니다. 이 작업을 수행하려면 dpk-divert를 사용 하고 모든 바이너리에 대해 이와 같은 작업을 수행 할 수 sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzip있지만 pigz가 모든 gzip 플래그와 100 % 호환되지 않을 가능성이 있으므로주의하십시오.
Mark McKinstry

31

symlink 아이디어는 정말 좋습니다.
또 다른 작업 솔루션은 별칭입니다 tar.

alias tar='tar --use-compress-program=pbzip2'

또는 각각

alias tar='tar --use-compress-program=pigz'

다른 종류의 기본값을 만듭니다.


추가 혜택 : 원래 기능을 유지하려면 'partar'와 같은 별칭을 사용할 수 있습니다 (어떤 이유로 든). 슬프게도 'ptar'는 perl 구현에 의해 수행됩니다
jena

13

심볼릭 링크 답변이 실제로 잘못되었습니다. 전체 시스템에서 기본 gzip (또는 bzip2)을 pigz (또는 pbzip2)로 바꿉니다. 병렬 구현은 단일 프로세스 버전과 매우 유사하지만 명령 줄 옵션의 미묘한 차이는 이러한 차이에 의존하는 핵심 시스템 프로세스를 손상시킬 수 있습니다.

"--use-compress-program"옵션이 훨씬 나은 선택입니다. 두 번째 옵션 (별명과 유사)은 GNU tar에서 지원하는 TAR_OPTIONS 환경 변수를 설정하는 것입니다.

$ export TAR_OPTIONS = "-use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /

6
나는 2011 년부터 심볼릭 링크를 사용하고 있으며 (편집에서 언급 한 경우를 제외하고) 파손을 보지 못했습니다. 그리고 그러한 미묘한 차이가 발견되지 않고보고되지 않으면, 우리는 비 병렬 버전으로 영원히 붙어있을 것입니다. TAR_OPTIONS = "-use-compress-program = pbzip2"를 사용하면 bzip2와 gzip을 구분할 수없는 것 같습니다.
elmicha

이것은 나를 위해 작동하지 않았습니다.
Derek Perkins

3

매력적인 옵션 중 하나는 기본적으로 다중 스레드를 사용하도록 tar를 다시 컴파일하는 것입니다. 이 stackoverflow 답변 에서 복사

교체를 통한 재 컴파일

소스에서 tar를 빌드하면 매개 변수를 사용하여 다시 컴파일 할 수 있습니다.

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

이러한 옵션으로 tar를 다시 컴파일 한 후 tar의 도움말 출력을 확인할 수 있습니다.

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

-2

~ / .bash_aliases에서 사용하십시오.

alias gzip="pigz"
alias gunzip="unpigz"

1
이것은 쉘의 명령 행 에서 gzip(또는 gunzip) 프로그램을 직접 호출 할 때만 작동 합니다. 같은 다른 프로그램 tar은 그 영향을받지 않습니다.
Christian Hudon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.