Zip이 동일한 콘텐츠를 가진 여러 파일보다 작은 단일 파일을 압축 할 수있는 이유는 무엇입니까?


126

10,000 개의 XML 파일이 있다고 가정합니다. 이제 친구에게 보내려고한다고 가정하십시오. 보내기 전에 압축하고 싶습니다.

방법 1 : 압축하지 마십시오

결과 :

Resulting Size: 62 MB
Percent of initial size: 100%

방법 2 : 모든 파일을 압축하여 10,000 xml 파일을 보냅니다.

명령:

for x in $(ls -1) ;  do   echo $x ; zip "$x.zip" $x ; done

결과 :

Resulting Size: 13 MB
Percent of initial size: 20%

방법 3 : 10,000 개의 xml 파일을 포함하는 단일 zip 만들기

명령:

zip all.zip $(ls -1)

결과 :

Resulting Size: 12 MB
Percent of initial size: 19%

방법 4 : 파일을 단일 파일로 연결하고 압축

명령:

cat *.xml > oneFile.txt ; zip oneFile.zip oneFile.txt

결과 :

Resulting Size: 2 MB
Percent of initial size: 3%

질문 :

  • 단일 파일을 압축 할 때 왜 이렇게 뛰어난 결과를 얻습니까?
  • 방법 2보다 방법 3을 사용하여 훨씬 더 나은 결과를 얻을 것으로 기대했지만 그렇지 않았습니다. 왜?
  • 이 동작은 특정 zip입니까? 사용하려고 gzip하면 다른 결과가 나옵니까?

추가 정보:

$ zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon.  Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.

Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.

Compiled with gcc 4.4.4 20100525 (Red Hat 4.4.4-5) for Unix (Linux ELF) on Nov 11 2010.

Zip special compilation options:
    USE_EF_UT_TIME       (store Universal Time)
    SYMLINK_SUPPORT      (symbolic links supported)
    LARGE_FILE_SUPPORT   (can read and write large files on file system)
    ZIP64_SUPPORT        (use Zip64 to store large files in archives)
    UNICODE_SUPPORT      (store and read UTF-8 Unicode paths)
    STORE_UNIX_UIDs_GIDs (store UID/GID sizes/values using new extra field)
    UIDGID_NOT_16BIT     (old Unix 16-bit UID/GID extra field not used)
    [encryption, version 2.91 of 05 Jan 2007] (modified for Zip 3)

편집 : 메타 데이터

한 가지 대답은 차이점이 Zip에 저장된 시스템 메타 데이터라는 것입니다. 나는 이것이 사실 일 수 있다고 생각하지 않는다. 테스트하기 위해 다음을 수행했습니다.

for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)

결과 zip은 1.4MB입니다. 이것은 아직 설명되지 않은 공간이 ~ 10MB라는 것을 의미합니다.


34
내가 실수하지 않으면 사람들 .tar.gz이 전체 디렉토리를 압축하는 것과 반대로 만드는 것은이 페 노모 나입니다 .
corsiKa

18
비슷한 질문이 이미 TL을 요청했다; 박사는 고체 7zip과 아카이브를 사용합니다.
Dmitry Grigoryev

3
@sixtyfootersdude 답 중 일부를 검증하는 테스트로서 방법 3에서 생성 된 지퍼를 압축 할 수 있습니까? 나는 이것이 파일 크기를 방법 4와 비슷한 것으로 줄일 것이라고 생각한다.
Travis

7
대신 다음을 $(ls -1)사용 *하십시오 for x in *. zip all.zip *
muru December

4
ZIP으로 압축을하려면 다음과 같은 해결 방법이 있습니다. 먼저 모든 파일이 포함 된 압축되지 않은 ZIP을 만듭니다 . 그런 다음 ZIP을 다른 압축 ZIP 안에 넣습니다.
user20574

답변:


129

Zip은 압축시 각 파일의 내용을 개별적으로 처리합니다. 각 파일에는 자체 압축 스트림이 있습니다. 반복되는 섹션을 식별하기 위해 압축 알고리즘 (일반적으로 DEFLATE ) 내에 지원이 있습니다. 그러나 Zip에서 파일 간 중복성을 찾기위한 지원은 없습니다.

콘텐츠가 여러 파일에있을 때 여분의 공간이 너무 많은 이유는 파일에 동일한 압축 스트림을 여러 번 넣는 것입니다.


9
또한 일부 압축 도구가 파일을 개별적으로 또는 단일 엔티티로 압축하는 옵션을 제공하는 이유이기도합니다. (일반적으로 이는 단일 파일 만 보려는 경우보다 아카이브의 압축을 풀어야 함을 의미합니다.)
JAB

28
@JAB : 7z 및 rar와 같은 압축 도구는 "고체"아카이브라는 용어를 사용하여 여러 파일을 큰 압축 스트림으로 압축합니다. 64MiB와 같은 적당한 청크 크기를 사용하면 단일 파일에 대한 임의 액세스에 파일이 들어있는 압축 블록의 시작부터 최대 64MiB의 데이터를 압축 해제해야 할 수도 있습니다. 7z는보다 효과적인 LZMA 압축 체계를 사용할 수 있으며 이는 우편에 비해 또 다른 장점입니다.
Peter Cordes

there is no support in Zip to find redundancy between fileszip 파일 사양에 있다고 말하고 있습니까?
sixtyfootersdude

6
@sixtyfootersdude DEFLATE와 같은 많은 압축 알고리즘은 스트림으로 작동합니다. 스트림의 일부를 압축 해제하기에 충분한 정보를 복구하려면 해당 지점까지 전체 스트림을 처리해야합니다. 그들이 파일들 사이에서 중복성을 찾으려고한다면, 마지막 파일에 도달하기 위해 1000 개의 파일을 모두 압축 해제해야합니다. 이것은 일반적으로 실제로 tgz가 작동하는 방식입니다. 그러나 zip은 개별 파일을 추출 할 수 있도록 설계되었습니다. tgz는 더 또는 전혀없는 것으로 설계되었습니다
Cort Ammon

1
@ sixtyfootersdude-맞습니다. Cort를 말로 표현하려면 : pkzip 스펙은 크로스 파일 작업을 지원하지 않습니다. 파일을 추출한 경우 전체 아카이브 (및 모든 파일)를 추출해야 할 수 있습니다.
James Snell

48

ZIP 압축은 압축 할 데이터의 반복적 인 패턴을 기반으로하며, 더 많은 패턴을 찾아서 사용할 수 있으므로 파일이 길수록 압축 성능이 향상됩니다.

단순화 된 파일 하나를 압축하면 (짧은) 코드를 (더 긴) 패턴으로 매핑하는 사전이 각 결과 zip 파일에 포함되어야합니다. 하나의 긴 파일을 압축하면 사전이 '재사용'되며 모든 컨텐츠에서 훨씬 더 효과적입니다.

파일이 약간 유사하더라도 (텍스트가 항상 그러 하듯이) '사전'을 재사용하는 것이 매우 효율적이며 결과적으로 전체 우편 번호가 훨씬 작아집니다.


3
ZIP은 보관 및 압축을 모두 수행합니다. 이것은 ZIP이 각 파일이 동일한 ZIP 파일로 끝나더라도 각 파일을 개별적으로 압축한다는 것을 의미합니까?
gerrit

2
그것은 하나의 파일을 제거한다고 상상하고, 새로운 '사전'으로 나머지를 다시 압축하는 데 30 분을 더 보내고 싶지는 않을 것입니다. -또한 파일마다 다른 '사전'이 필요하다고 가정합니다.
Aganju

2
왜 그런지 모르겠습니다. 유닉스 도구를 사용하면 먼저 tar를 사용하여 파일을 보관 한 다음 gzip / bz2 / lzma로 압축합니다. 압축 알고리즘은 아카이브에 인코딩 된 파일 수를 상관하지 않습니다. 또한 압축 아카이브에서 단일 파일을 제거하는 것이 얼마나 흔한 일입니까? 나는 그런 짓을 한 적이 없다고 생각합니다.
gerrit

4
나는 동의하지 않으며, 아마도 좋은 방법 일 것입니다. ZIP을 디자인하거나 쓰지 않았습니다. 방금 뭐라고했는지 ...
Aganju

16
@gerrit 자체 문제가 있습니다. Zip은 아카이브의 모든 파일에 빠르게 액세스 할 수 있도록 설계되었습니다. 100 GiB UHA 아카이브에서 단일 파일의 압축을 풀면 이러한 방법을 선택한 이유를 알 수 있습니다. 또한 추가 용으로 설계되었습니다. 백업 압축을 유지하고 필요에 따라 파일을 계속 추가 (또는 교체) 할 수 있습니다. 이 모든 것은 아카이브를 사용할 때 큰 도움이됩니다. 단점 은 매우 유사한 파일을 압축하는 경우 ( 일반적인 것은 아니지만 ) 유사성을 이용하여 아카이브 크기를 줄일 수 없다는 것입니다.
Luaan

43

Zip에서 각 파일은 별도로 압축됩니다. 반대로 '고체 압축', 즉 파일이 함께 압축됩니다. 7-zip 및 Rar는 기본적으로 견고한 압축을 사용합니다. Gzip 및 Bzip2는 여러 파일을 압축 할 수 없으므로 Tar이 먼저 사용되므로 솔리드 압축과 동일한 효과가 있습니다.

xml 파일은 구조가 비슷하고 파일이 함께 압축 된 경우 비슷한 내용 일 수 있으므로 압축률이 높아집니다.

예를 들어 파일에 문자열이 포함되어 있고 "<content><element name="압축기가 이미 다른 파일에서 해당 문자열을 발견 한 경우, 압축기가 '고체 압축'을 사용하지 않으면 해당 문자열이 첫 번째 일치 항목 인 '고체 압축'으로 대체됩니다. 파일은 더 큰 리터럴로 기록됩니다.


9

Zip은 파일의 내용을 저장할뿐만 아니라 소유 한 사용자 아이디, 권한, 생성 및 수정 시간 등과 같은 파일 메타 데이터도 저장합니다. 하나의 파일이 있으면 하나의 메타 데이터 세트가 있습니다. 10,000 개의 파일이있는 경우 10,000 개의 메타 데이터 세트가 있습니다.


3
좋은 지적이지만 시스템 메타 데이터는 1.4MB의 공간을 차지합니다. 내 편집을 참조하십시오.
sixtyfootersdude

1
나는 zip 알고리즘에 익숙하지 않지만 메타 데이터는 파일 정보뿐만 아니라 크기 및 사전과 같은 것, 문자 분포에 대한 정보 일 수도 있습니다. 비어 있지 않은 텍스트 파일의 사전은 0이 아닙니다. xml 파일에서 메타 데이터가 빈 파일보다 더 큰 이유가 여기에 있습니다.
Ben Richards

이것이 나의 첫 생각이었습니다. Zip 파일 헤더 정보
WernerCD

이것은 4가 아닌 2와 3의 차이점만을 설명합니다.
Luaan

@Luaan No, 2와 3 모두에서 10,000 개 파일 모두에 대한 메타 데이터가 zip 파일에 포함되므로 전체 파일 크기는 거의 같은 크기입니다. 4에는 하나의 파일에 대한 메타 데이터 만 있으며 zip 파일은 훨씬 작습니다.
Mike Scott

7

OP에서 누락 된 옵션은 압축을 해제 한 상태에서 모든 파일을 압축 한 다음 압축을 최대로 설정하여 결과 zip을 압축하는 것입니다. 이것은 압축이 파일 경계에 걸쳐 중복성을 악용 할 수있게하여 * nix .tar.Z, .tar.gz, .tar.bz 등 압축 아카이브의 동작을 대략적으로 모방합니다. 패스). 이를 통해 개별 XML 파일을 나중에 추출 할 수 있지만 압축을 최대화합니다. 단점은 추출 프로세스에 일반 단계의 .zip에 필요한 것보다 더 많은 디스크 공간을 일시적으로 사용하여 추가 단계가 필요하다는 것입니다.

tar 제품군을 Windows로 확장하기 위해 7-Zip과 같은 무료 도구가 널리 사용되므로 Linux, OS X 및 BSD가 모두 .tar.gz 또는 .tar.bz 등을 사용하지 않을 이유가 없습니다. 그것들을 조작하는 기본 도구.


gzip 및 bzip2는 압축 스트림을 염두에두고 설계 되었기 때문에 더 나빠질 수 있으므로 압축 할 모든 데이터를 알기 전에 압축 된 데이터 출력을 시작해야합니다.
rackandboneman

@rackandboneman : 압축시 사용하고자하는 메모리 용량보다 큰 파일을 압축 할 때 수행해야하는 단점입니다. 또한 전역 적으로 최적의 것을 찾는 데 필요한 CPU 시간도 엄청납니다. 압축 사전이 크면 압축 해제에 필요한 메모리도 증가 할 수 있습니다 . LZMA ( xz/ 7-zip) 옵션입니다 . 어쨌든 적응 형 사전은 패턴이 표시되면이를 선택할 수 있습니다. 처음 32k를 기반으로 정적 코딩 시스템을 구축하는 것과는 다릅니다. 이것이 gzip이 빨지 않는 이유입니다.
Peter Cordes

zip 형식을 유지해야 할 경우이 "트릭"이 정말 마음에 듭니다. "7-zip을 사용하지 않는 이유"에 동의하지 않습니다. 기술적이지 않은 친구에게 파일을 보내면 파일을 쉽게 열 수 있기를 바랍니다. 비즈니스 클라이언트에게 보내는 경우 훨씬 더 그렇습니다.
Wowfunhappy

5

zip 압축 형식은 각 파일을 개별적으로 저장하고 압축합니다. 파일 내에서만 반복을 이용하지 않으며 파일 내에서만 사용합니다.

파일을 연결하면 zip이 모든 파일에서 반복을 활용할 수 있으므로 압축률이 크게 향상됩니다.

예를 들어, 각 XML 파일에 특정 헤더가 있다고 가정하십시오. 해당 헤더는 각 파일에서 한 번만 발생하지만 다른 많은 파일에서도 거의 동일하게 반복됩니다. 방법 2와 3에서는 zip을 압축 할 수 없지만 방법 4에서는 압축 할 수 없습니다.


3
5 시간 전에 이미 게시 된 상위 3 개 답변 중 하나와 다른 점은 무엇입니까?
Xen2050

1
@ Xen2050 큰 차이는 없지만 더 명확하게 설명 할 수 있다고 생각했습니다.
BonsaiOak

1
@BonsaiOak-정답에 의견을 추가하거나 담당자가 충분하면 편집하십시오. 그렇지 않은 경우 댓글에 명확성이 추가되면 다른 사람이이를 선택하여 게시물을 편집 할 수 있습니다.
AdamV

@AdamV 당신의 요점을 참조하십시오. 내 대답은 현재 쓸 때 틀림없이 유용한 정보를 추가하지는 않습니다. 첫 번째 답변에는 이미 적절한 의견이 있으므로 의견을 추가 할 때 요점이 없습니다. 내가 대답을 끝내야한다는 말입니까? 열린 채로두면 어떤 해가 있습니까?
BonsaiOak

4

Mike Scott이 언급 한 메타 데이터 옆에는 압축 알고리즘에도 오버 헤드가 있습니다.

여러 개의 작은 파일을 압축 할 때 압축 블록 하나만 채우면 압축 할 수 있기 때문에 운이 좋을 것입니다. 단일 모 놀리 식 블록을 압축 할 때 시스템은 개별 파일의 '경계'(더 나은 단어가 없음)를 무시하고 데이터를 알고리즘으로 계속 스트리밍 할 수 있습니다.

또한 ASCII는 압축률이 높은 것으로 알려져 있습니다. plus xml은 종종 메타 데이터를 XML 콘텐츠처럼 쉽게 압축 할 수없는 많은 양의 데이터 덩어리로 만드는 매우 반복적입니다.

마지막으로, 메모리가 제대로 작동하면 zip은 사전 인코딩과 같은 것을 사용하는데, 이는 특히 ASCII 파일과 XML의 반복성으로 인해 더욱 효과적입니다.

데이터 압축 설명 : http://mattmahoney.net/dc/dce.html


3

이 XML을 고려하십시오.

<root>
  <element id="1" />
  <element id="2" /> 
  <other id="3" />
  ...
</root>

XML은 매우 반복적 인 구조를 가지고 있으며 Zip은 이러한 반복을 활용하여 패턴 이 더 많이 발생 하는 사전을 빌드 한 다음 압축 할 때 더 적은 비트를 사용하여 더 많은 반복 패턴 을 저장하고 더 많은 비트를 사용하여 덜 반복 된 패턴 을 저장 합니다.

이 때 연결하여 해당 파일을 소스 파일 (ZIP의 소스는) 큰하지만, 훨씬 더 포함 반복 패턴을 하는 XML의 지루한 구조 드 분포되어 있기 때문에 상각 하는 저장 ZIP 할 수있는 기회 제공, 큰 전체 파일 패턴을 적은 비트를 사용합니다.

이제 다른 XML을 단일 파일로 결합하면 해당 파일의 태그 이름이 완전히 다른 경우에도 압축 알고리즘은 파일 단위가 아닌 모든 파일 에서 최상의 패턴 분포를 찾습니다.

궁극적으로 압축 알고리즘은 최상의 반복 패턴 분포를 발견했습니다.


-1

7-Zip 답변 외에도 좋은 방법은 아니지만 어떤 이유로 7-Zip을 사용하지 않으려는 경우 테스트 할 가치가있는 또 다른 접근법이 있습니다.

zip 파일을 압축하십시오. 일반적으로 압축 파일은 압축 할 수 없지만 압축 파일이 많은 경우 압축기는이 중복성을 찾아 압축 할 수 있습니다. 중복없이 많은 수의 파일을 처리 할 때 약간의 이득을 보았습니다. 당신이 정말로 크기에 관심이 있다면 당신의 zip에 많은 파일이 있는지 시도해 볼 가치가 있습니다.


위에서 언급 한 것처럼 압축을 끈 상태에서 첫 번째 zip을 수행하는 경우에만 작동합니다.
Monty Harder

@MontyHarder 압축을 켠 상태에서 작동하는 것을 보았습니다.
Loren Pechtel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.