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
이것이 일반적으로 내가 기대하는 것입니까?
압축을 개선 할 수있는 방법이 있습니까?
답변
컴프레서의 “블록 크기”에 맞습니다. 대부분의 압축 프로그램은 입력을 블록으로 나누고 각 블록을 압축합니다. 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 패턴을 찾습니다. 그러나 압축 (및 압축 해제)을 수행하는 데 필요한 램 양에 유의하십시오 …
답변
선택한 임의의 파일 내용은 좋은 예가 아닙니다. 압축 된 tarfile은 원본보다 큽니다 . 이미 압축 된 형식의 파일 (예 : 많은 이미지 / 오디오 / 비디오 형식)에서도 동일하게 표시됩니다.
그러나 압축 가능한 내용으로 여러 파일을 함께 tar하면 일반적으로 파일을 별도로 tar 할 때 (특히 동일한 프로그램의 로그 파일 등)에 비해 tar 파일의 크기가 더 작습니다. 그 이유는 파일 별 압축 오프셋 데이터 (일부 압축 알고리즘의 패턴 배열과 같은)를 동일한 tarfile의 모든 파일에서 공유 할 수 있기 때문입니다.
답변
이미 표시된대로 :
- 임의의 파일을 사용하는 것은 이미 최대 “정보 엔트로피”를 포함하므로 압축되지 않습니다.
- 공정한 비교를 위해 많은 파일 을 포장해야합니다 .
더 나은 테스트 사례는 다음과 같습니다.
cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h
(참고 : 아래에 마운트가 없기를 바랍니다 /usr
!)
tar -jcf
대신 xz 압축에 사용할 수 있습니다 .
이제 test2.tar.gz
test1.tar.gz보다 작은 경우 테스트에 성공한 것입니다 (예 : 파일 압축 후 압축이 압축 후 압축보다 낫습니다). 내 생각에 그것은 많은 (즉, 수천) 파일 일 것이다. 단점은 전체 tar 파일을 먼저 빌드 한 다음 압축해야하므로 디스크 공간이 많이 필요할뿐 아니라 실행 시간이 더 오래 걸릴 수 있다는 것입니다. 타르볼을 작게 만들지 않아도 각 파일을 즉시 압축하므로 첫 번째 방법이 대신 사용되는 이유가 여기에 있습니다.
예를 들어 오프 사이트 백업에서는 일반적으로 총 2TB에 해당하는 4,000,000 개의 파일을 백업합니다. 따라서 첫 번째 방법은 훨씬 빠르며 추가 2TB의 디스크가 필요하지 않습니다.