파일을 압축 해제하면 압축률을 높일 수 있습니까?


9

gzip, bzip2, xz와 같은 표준 도구를 사용하여 여러 파일을 함께 압축하면 압축률을 높일 수 있습니까?

나는 이것이 사실이라고 생각했지만 테스트하지는 않았습니다. 동일한 바이트의 임의 바이트의 동일한 20Mb 파일의 사본이 2 개있는 경우,이를 인식하는 영리한 압축 프로그램이 전체 타르볼을 거의 20Mb로 압축 할 수 있습니다.

방금 1) 임의의 바이트 파일, 2) 해당 파일의 사본 두 개, 3) 해당 파일의 사본 두 개를 압축하기 위해 gzip, bzip2 및 xz를 사용하여이 실험을 시도했습니다. 모든 경우에 압축으로 파일 크기가 줄어들지 않았습니다. 이것은 사례 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

이것이 일반적으로 내가 기대하는 것입니까?

압축을 개선 할 수있는 방법이 있습니까?


테스트 사례는 나쁜 예입니다. ~ 100 (실제) 텍스트 파일의 디렉토리로 테스트를 해보십시오.
lcd047

왜 나쁜 예입니까? 우리는 정확히 무엇을 기대해야하는지 알고 있습니다. 임의의 파일은 압축 할 수 없으며 임의의 파일 중 2 개는 절반으로 압축 할 수 있습니다.
Praxeolitic

"무작위"파일 내용에 문제가 있습니다. 압축 할 수 없습니다. 더 큰 아이디어를 얻으려면 두 개의 다른 큰 텍스트 파일을 사용하십시오. 여기서 관련된 아이디어는 "정규화 된 압축 차이"입니다. 당신은 한 번 봐 걸릴 수 있습니다 ims.cuhk.edu.hk/~cis/2005.4/01.pdf를 당신이 테스트의이 종류의 일을 발생할 수있는 문제의 유형을 확인하려면 다음을 참조하십시오.
Bruce Ediger

답변:


11

컴프레서의 "블록 크기"에 맞습니다. 대부분의 압축 프로그램은 입력을 블록으로 나누고 각 블록을 압축합니다. 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 패턴을 찾습니다. 그러나 압축 (및 압축 해제)을 수행하는 데 필요한 램 양에 유의하십시오 ...


1
그러나 xz-8은 테스트에서 타르볼과 고양이를 21M로 줄입니다.
Praxeolitic

1
블록 크기보다 더 많은 것이 있습니다. 그러나 전체 이야기는 SE의 몇 단락에서 설명 할 수있는 것이 아닙니다.
lcd047

1
@Praxeolitic 데이터 압축 과정이 도움이 될 수 있습니다.
lcd047

1
@ lcd047 압축은 큰 주제이지만 여기서의 질문은 단순히 "이 압축하지 않은 이유"였으며, 반복되는 패턴에서 압축이 작동하고 그가 찾길 원하는 패턴이 다른 도구보다 더 오래 걸리기 때문입니다.
dataless

1
또한 대부분의 명령 행 압축기에서 "-9"는 "패턴을 찾기가 더 어렵다"는 의미가 아니라 "더 큰 패턴 공간 고려"를 의미한다는 것이 유용하다고 생각합니다.
dataless

2

선택한 임의의 파일 내용은 좋은 예가 아닙니다. 압축 된 tarfile은 원본보다 큽니다 . 이미 압축 된 형식의 파일 (예 : 많은 이미지 / 오디오 / 비디오 형식)에서도 동일하게 표시됩니다.

그러나 압축 가능한 내용으로 여러 파일을 함께 tar하면 일반적으로 파일을 별도로 tar 할 때 (특히 동일한 프로그램의 로그 파일 등)에 비해 tar 파일의 크기가 더 작습니다. 그 이유는 파일 별 압축 오프셋 데이터 (일부 압축 알고리즘의 패턴 배열과 같은)를 동일한 tarfile의 모든 파일에서 공유 할 수 있기 때문입니다.



@kos 이것은 사용 된 알고리즘과 데이터에 따라 다릅니다. 인용 된 33 %는 매우 특별한 경우입니다. gzip 및 bzip2를 사용하여 무작위로 생성 된 1MB 파일 1000 개를 측정하여 모든 파일 에서 <1 % 증가했습니다 .
jofel

2

이미 표시된대로 :

  1. 임의의 파일을 사용하는 것은 이미 최대 "정보 엔트로피"를 포함하므로 압축되지 않습니다.
  2. 공정한 비교를 위해 많은 파일 을 포장해야합니다 .

더 나은 테스트 사례는 다음과 같습니다.

cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h

(참고 : 아래에 마운트가 없기를 바랍니다 /usr!)

tar -jcf대신 xz 압축에 사용할 수 있습니다 .

이제 test2.tar.gztest1.tar.gz보다 작은 경우 테스트에 성공한 것입니다 (예 : 파일 압축 후 압축이 압축 후 압축보다 낫습니다). 내 생각에 그것은 많은 (즉, 수천) 파일 일 것이다. 단점은 전체 tar 파일을 먼저 빌드 한 다음 압축해야하므로 디스크 공간이 많이 필요할뿐 아니라 실행 시간이 더 오래 걸릴 수 있다는 것입니다. 타르볼을 작게 만들지 않아도 각 파일을 즉시 압축하므로 첫 번째 방법이 대신 사용되는 이유가 여기에 있습니다.

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


아카이브 (예 : tar)를 -z압축 하지 않습니까? 일반적으로 출력 파일 이름은 .tar.gz로 끝나서 강조합니다. czf
Jari Keinänen 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.