표준 도구(예: gzip, bzip2, xz)를 사용하여 여러 파일을 함께 압축하면 압축이 향상될 수 있습니까?
나는 항상 이것이 사실이라고 가정했지만 테스트해본 적은 없습니다. 동일한 20Mb 파일의 복사본 2개를 무작위 바이트로 함께 압축하면 영리한 압축 프로그램이 이를 실현하고 전체 타르볼을 거의 20Mb로 압축할 수 있습니다.
방금 gzip, bzip2 및 xz를 사용하여 1) 임의 바이트 파일, 2) 두 파일 복사본의 tarball, 3) 두 파일 복사본의 cat을 압축해 보았습니다. 모든 경우에 압축으로 인해 파일 크기가 줄어들지는 않습니다. 사례 1의 경우 이는 예상된 결과이지만 사례 2와 3의 경우 가장 좋은 결과는 40Mb 파일이 20Mb에 가깝게 축소될 수 있다는 것입니다. 이는 특히 중복성이 멀리 있기 때문에 압축기가 보기 어려운 통찰력이므로 완벽한 결과를 기대하지는 않지만 여전히 어느 정도 압축이 있을 것이라고 생각합니다.
시험:
dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*
결과:
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1] Done gzip -k random*
[2]- Done bzip2 -k random*
[3]+ Done xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz
이것이 일반적으로 내가 예상해야 하는 것입니까?
압축률을 높이는 방법이 있나요?
답변1
압축기의 "블록 크기"에 직면하게 됩니다. 대부분의 압축기는 입력을 청크로 나누고 각 청크를 압축합니다. bzip 블록 크기는 최대 900K로 제한되어 있으므로 반복하는 데 900K 바이트 이상이 필요한 패턴은 표시되지 않습니다.
http://www.bzip.org/1.0.3/html/memory-management.html
gzip은 32K 블록을 사용하는 것 같습니다.
xz와 함께라면 행운이 따릅니다! 매뉴얼 페이지에서:
Preset DictSize CompCPU CompMem DecMem
-0 256 KiB 0 3 MiB 1 MiB
-1 1 MiB 1 9 MiB 2 MiB
-2 2 MiB 2 17 MiB 3 MiB
-3 4 MiB 3 32 MiB 5 MiB
-4 4 MiB 4 48 MiB 5 MiB
-5 8 MiB 5 94 MiB 9 MiB
-6 8 MiB 6 94 MiB 9 MiB
-7 16 MiB 6 186 MiB 17 MiB
-8 32 MiB 6 370 MiB 33 MiB
-9 64 MiB 6 674 MiB 65 MiB
따라서 "xz -8"은 최대 32MB의 패턴을 찾고, "xz -9"는 최대 64MB의 패턴을 찾습니다. 하지만 압축(및 압축 해제)을 수행하는 데 필요한 메모리 양을 알고 있어야 합니다.
답변2
이미 지적했듯이:
- 임의 파일을 사용하는 것은 이미 최대 "정보 엔트로피"를 포함하고 있으므로 압축되지 않기 때문에 좋지 않습니다.
- 너는 짐을 싸야 해많은공정한 비교를 위한 파일입니다.
더 나은 테스트 사례는 다음과 같습니다.
cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h
(참고: 아래에 마운트가 없기를 바랍니다 /usr
!)
대신 xz 압축을 사용할 수 있습니다 tar -jcf
.
이제 test2.tar.gz
test1.tar.gz보다 작으면 테스트가 성공한 것입니다(즉, 파일을 먼저 압축한 다음 압축하는 것이 먼저 파일을 압축한 다음 다시 압축하는 것보다 낫습니다). 내 생각에는 많은(즉 수천 개의) 파일에 대한 것입니다. 단점은 전체 tar 파일을 먼저 빌드한 다음 압축해야 하기 때문에 실행하는 데 시간이 더 오래 걸릴 수 있고 더 많은 디스크 공간이 필요하다는 것입니다. 이것이 작은 타르볼을 제공하지 않더라도 각 파일을 즉시 압축하기 때문에 첫 번째 방법이 자주 사용되는 이유입니다.
예를 들어, 오프사이트 백업에서는 일반적으로 4,000,000개의 파일, 즉 총 2TB를 백업합니다. 따라서 첫 번째 방법은 훨씬 빠르며 추가로 2TB 디스크가 필요하지 않습니다.
답변3
이것무작위의선택한 파일 내용은 좋은 예가 아닙니다. 압축된 tar 파일은 다음과 같습니다.큰원본보다. 이미 압축된 형식(예: 다양한 이미지/오디오/비디오 형식)의 파일에서도 동일한 현상이 나타납니다.
그러나 압축 가능한 콘텐츠가 포함된 여러 파일을 함께 패키징하면 일반적으로 개별적으로 패키징하는 것보다 전체 tar 파일 크기가 더 작아집니다. 특히 콘텐츠가 유사한 경우(예: 동일한 프로그램의 로그 파일) 더욱 그렇습니다. 그 이유는 일부 파일별 압축 오프셋 데이터(예: 일부 압축 알고리즘의 패턴 배열)가 동일한 tar 파일의 모든 파일에서 공유될 수 있기 때문입니다.