파일을 압축하면 압축률이 향상될 수 있나요?

파일을 압축하면 압축률이 향상될 수 있나요?

표준 도구(예: 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

이미 지적했듯이:

  1. 임의 파일을 사용하는 것은 이미 최대 "정보 엔트로피"를 포함하고 있으므로 압축되지 않기 때문에 좋지 않습니다.
  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.gztest1.tar.gz보다 작으면 테스트가 성공한 것입니다(즉, 파일을 먼저 압축한 다음 압축하는 것이 먼저 파일을 압축한 다음 다시 압축하는 것보다 낫습니다). 내 생각에는 많은(즉 수천 개의) 파일에 대한 것입니다. 단점은 전체 tar 파일을 먼저 빌드한 다음 압축해야 하기 때문에 실행하는 데 시간이 더 오래 걸릴 수 있고 더 많은 디스크 공간이 필요하다는 것입니다. 이것이 작은 타르볼을 제공하지 않더라도 각 파일을 즉시 압축하기 때문에 첫 번째 방법이 자주 사용되는 이유입니다.

예를 들어, 오프사이트 백업에서는 일반적으로 4,000,000개의 파일, 즉 총 2TB를 백업합니다. 따라서 첫 번째 방법은 훨씬 빠르며 추가로 2TB 디스크가 필요하지 않습니다.

답변3

이것무작위의선택한 파일 내용은 좋은 예가 아닙니다. 압축된 tar 파일은 다음과 같습니다.원본보다. 이미 압축된 형식(예: 다양한 이미지/오디오/비디오 형식)의 파일에서도 동일한 현상이 나타납니다.

그러나 압축 가능한 콘텐츠가 포함된 여러 파일을 함께 패키징하면 일반적으로 개별적으로 패키징하는 것보다 전체 tar 파일 크기가 더 작아집니다. 특히 콘텐츠가 유사한 경우(예: 동일한 프로그램의 로그 파일) 더욱 그렇습니다. 그 이유는 일부 파일별 압축 오프셋 데이터(예: 일부 압축 알고리즘의 패턴 배열)가 동일한 tar 파일의 모든 파일에서 공유될 수 있기 때문입니다.

관련 정보