때때로 gzip2로 변환 해야하는 gzip 파일이 많이 있습니다. 현재, 나는 단순히 각 파일을 'gunzip'한 다음 'bzip2'인 쉘 스크립트를 사용하고 있습니다. 이것이 작동하지만 완료 하는 데 많은 시간이 걸립니다.
이 프로세스를보다 효율적으로 만들 수 있습니까? 다이빙을 준비하고 필요한 경우 gunzip 및 bzip2의 소스 코드를 살펴볼 준비가되었지만 그 결과를 확신하고 싶습니다. 프로세스의 효율성을 향상시킬 희망이 있습니까?
때때로 gzip2로 변환 해야하는 gzip 파일이 많이 있습니다. 현재, 나는 단순히 각 파일을 'gunzip'한 다음 'bzip2'인 쉘 스크립트를 사용하고 있습니다. 이것이 작동하지만 완료 하는 데 많은 시간이 걸립니다.
이 프로세스를보다 효율적으로 만들 수 있습니까? 다이빙을 준비하고 필요한 경우 gunzip 및 bzip2의 소스 코드를 살펴볼 준비가되었지만 그 결과를 확신하고 싶습니다. 프로세스의 효율성을 향상시킬 희망이 있습니까?
답변:
한 단계에서 gunzip과 다른 단계에서 bzip2 대신 파이프를 사용하는 것이 더 효율적인지 궁금합니다. 같은 것gunzip --to-stdout foo.gz | bzip2 > foo.bz2
둘 이상의 CPU로 생각하고 있는데, 이것이 더 빠를 것입니다. 그러나 아마도 단일 코어로도 가능합니다. 그래도 이것을 시도하지 않았다는 것을 부끄럽게 인정합니다.
bzip2
및 gzip
내부 병렬없는 일을 파이프가 암시 적으로 두 개의 프로세스, 시작하기 때문에, 파이프를 사용하여 당신은 병렬로 작업을 할 수 있습니다 합니다 병렬로 실행합니다. 따라서 최소한 압축 해제와 압축이 동시에 실행됩니다.
bzip2
CPU 사용률이 CPU 사용량을 줄 gunzip
이므로 실제로 병렬 처리는 최소화됩니다. 디스크 IO를 수행하지 않아도 여전히 좋습니다!
여러 코어 (또는 여러 머신)가있는 경우 GNU 병렬 ( http://www.gnu.org/software/parallel )이 옵션이 될 수 있습니다.
ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"
자세한 내용과 옵션은 튜토리얼 / 매뉴얼 페이지를 참조하십시오.
현재하고있는 것이 최선의 방법입니다. 사용 가능한 변환 도구가 없으며 이미 압축 된 파일을 bzip2로 시도하는 것은 바람직하지 않은 효과가 있기 때문에 실제로는 옵션이 아닙니다. 알고리즘이 다르기 때문에 변환에는 관계없이 원본 데이터를 검색해야합니다. 물론 gzipping이 bzip2 프로세스의 한 단계가 아니라면 불행히도 그렇지 않습니다.
gzip
Leimpel-Ziv 77을 bzip2
사용하고 Burrows-Wheeler 를 사용합니다. 다른 알고리즘은 두렵습니다.
때때로 로그 파일을 사용하여 동일한 작업을 수행해야합니다. 가장 작은 * .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
몇 개 이상인 경우 멋진 쉘 스크립트로 LJ 기사를 확인하십시오.
http://linuxgazette.net/123/bechtel.html
7zip은 압축률을 높이고 멀티 스레드입니다.
pbzip2
언급 해 주셔서 감사합니다 . 다른 사람에게 링크가로드되지 않는 경우 프로젝트 페이지 와 매뉴얼 페이지가 있습니다.