효율적으로 gzip 파일을 bzip2로 변환


10

때때로 gzip2로 변환 해야하는 gzip 파일이 많이 있습니다. 현재, 나는 단순히 각 파일을 'gunzip'한 다음 'bzip2'인 쉘 스크립트를 사용하고 있습니다. 이것이 작동하지만 완료 하는 데 많은 시간이 걸립니다.

이 프로세스를보다 효율적으로 만들 수 있습니까? 다이빙을 준비하고 필요한 경우 gunzip 및 bzip2의 소스 코드를 살펴볼 준비가되었지만 그 결과를 확신하고 싶습니다. 프로세스의 효율성을 향상시킬 희망이 있습니까?

답변:


1

이 질문은 오래 전에 pbzip2 를 사용할 수 없거나 stdin에서 압축 할 수 없었던 때에 요청 되었지만 이제 bzip2 대신 parallelpbzip2를 사용하여 압축 해제 단계와 압축 단계를 병렬화 할 수 있습니다 .

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

bzip2를 사용하는 것보다 훨씬 빠릅니다 .


안녕하세요, 오늘이 질문에 걸려 넘어지는 사람들에게 가장 좋은 옵션을 제공하기 때문에 허용되는 답변을 이것으로 변경했습니다. pbzip2언급 해 주셔서 감사합니다 . 다른 사람에게 링크가로드되지 않는 경우 프로젝트 페이지매뉴얼 페이지가 있습니다.
sundar-복원 모니카

15

한 단계에서 gunzip과 다른 단계에서 bzip2 대신 파이프를 사용하는 것이 더 효율적인지 궁금합니다. 같은 것gunzip --to-stdout foo.gz | bzip2 > foo.bz2

둘 이상의 CPU로 생각하고 있는데, 이것이 더 빠를 것입니다. 그러나 아마도 단일 코어로도 가능합니다. 그래도 이것을 시도하지 않았다는 것을 부끄럽게 인정합니다.


2
파이핑의 경우 +1, 디스크 I / O는 피하고 싶은 것입니다. 압축에 관해서는, 내가 착각하지 않는 한 bzip2는 평행하지 않습니다. : 당신은 • 병렬 압축을 pbzip2 같은 것을 사용해야 할 것 compression.ca/pbzip2
gustafc

... 불행히도, 사용 가능한 병렬 gzip 압축 해제 유틸리티가없는 것 같습니다.
gustafc

@gustafc : pbzip2에 대한 링크 덕분에 매우 도움이되었습니다 ...
sundar-복 직원 모니카

4
@gustafc :하더라도 bzip2gzip내부 병렬없는 일을 파이프가 암시 적으로 두 개의 프로세스, 시작하기 때문에, 파이프를 사용하여 당신은 병렬로 작업을 할 수 있습니다 합니다 병렬로 실행합니다. 따라서 최소한 압축 해제와 압축이 동시에 실행됩니다.
sleske

1
@sleske는 이론 상으로는 옳았지만 bzip2CPU 사용률이 CPU 사용량을 줄 gunzip이므로 실제로 병렬 처리는 최소화됩니다. 디스크 IO를 수행하지 않아도 여전히 좋습니다!
Johan Walles

6

여러 코어 (또는 여러 머신)가있는 경우 GNU 병렬 ( http://www.gnu.org/software/parallel )이 옵션이 될 수 있습니다.

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

자세한 내용과 옵션은 튜토리얼 / 매뉴얼 페이지를 참조하십시오.


3

현재하고있는 것이 최선의 방법입니다. 사용 가능한 변환 도구가 없으며 이미 압축 된 파일을 bzip2로 시도하는 것은 바람직하지 않은 효과가 있기 때문에 실제로는 옵션이 아닙니다. 알고리즘이 다르기 때문에 변환에는 관계없이 원본 데이터를 검색해야합니다. 물론 gzipping이 bzip2 프로세스의 한 단계가 아니라면 불행히도 그렇지 않습니다.


알고리즘 에 gzip 압축 풀기의 한 단계를 건너 뛸 수 있고 bzip 압축의 동일한 단계를 건너 뛸 수 있는 겹치는 단계가 없습니까?
sundar-복 직원 모니카

2
@ sundar 나는 그렇게 생각하지 않을 것입니다. gzipLeimpel-Ziv 77을 bzip2사용하고 Burrows-Wheeler 를 사용합니다. 다른 알고리즘은 두렵습니다.
새로운 123456

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

입력 덕분에 두 프로세스 간의 속도 차이와 그 의미에 대한 요점이 중요합니다.
sundar-복직 모니카


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있지만 조심하십시오. (낮게 시작하십시오!)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.