7zip 파일이 원시 파일보다 큰 이유는 무엇입니까? [복제]


37

가능한 중복 :
ZIP 압축이 왜 압축하지 않습니까?

7zipping.exe 파일을 시도했지만 실제로는 커졌습니다.

여기에 이미지 설명을 입력하십시오

이것이 예상되는 결과입니까?


3
예, 예상 된 결과입니다. 왜? 무언가가 이미 압축되어 있으면 (= 더 작은 공간 사용) 더 이상 압축 할 수 없습니다.
woliveirajr

4
이 exe 파일은 구체적으로 설치 프로그램이므로 대부분의 내용은 zip 또는 cab 아카이브 일 수 있습니다. 일반 exe 파일에서 동일한 결과를 얻을 수는 없지만 대부분의 일반 exe 파일은 145MB가 아닙니다.
Random832

1
기본 논리 만 사용 : 압축은 원시 파일에서 UNIQUE 압축 파일 및 압축 된 파일 UNIQUE 원시 (압축되지 않은) 원본 파일을 찾습니다. 8 비트 파일이 있고 5 비트 파일로 압축하려고한다고 가정하십시오. 256 개의 고유 한 8 비트 파일이 있지만 32 개의 고유 한 5 비트 파일 (!) 만 있으므로 일부 8 비트 파일은 동일한 5 비트 파일 (!)로 압축해야합니다. 그리고 두 개의 다른 원시 파일이 동일한 ZIP 파일로 압축 된 경우 압축 해제 후 어떤 파일을 원하십니까? 압축 방법의 경우 압축 후 파일 크기가 작아지면 더 커야합니다 (!)
Ivan Kuckir

답변:


78

그것은 엔트로피 (entropy) 라는 개념으로 귀결 됩니다. Wikipedia를 참조하십시오 .

기본 아이디어는 항상 파일을 더 작게 만들 수있는 압축 작업이 존재하면 논리는 해당 압축 작업이 파일을 0 바이트로 줄이고 모든 데이터를 계속 유지할 수 있다는 것입니다. 그러나 우리는 0 바이트가 정보를 전혀 전달할 수 없다는 것을 알고 있기 때문에 이것은 터무니 없습니다. 따라서 입력을 항상 작게 만드는 압축 알고리즘이 존재하지 않는다는 것을 이미 증명했습니다 . 그럴 경우 어떤 정보도 0 바이트로 저장할 수 있지만 0 바이트 는 정보 가 없음 을 의미 하므로 ' t는 정보와 모든 정보를 동시에 가지고 있지 않습니다 . 따라서 터무니 없다.

이 이론적 인 개념으로 인해, 사용하는 모든 압축 프로그램은 일부 입력 의 크기 를 늘리 거나 (또는 ​​기껏해야 동일한 크기를 유지) 입니다. 즉, 설계하거나 사용하는 압축 알고리즘의 경우 특정 입력이 더 작게 나오고 그렇지 않은 입력이있을 수 있습니다.

대부분의 무손실 압축 알고리즘은 동일한 이론적 원리를 기반으로하기 때문에 이미 압축 된 데이터는 일반적으로 추가 압축의 끔찍한 후보입니다. 더욱 저조한 압축 된 데이터를 압축 할 수있다; 그러나 이것은 원래 데이터에서 가장 유용한 알고리즘으로 간단히 압축하는 것보다 효율적이지 않습니다.

예를 들어 100MB 텍스트 파일이 있고 일반 Zip 알고리즘을 사용하여 압축하면 50MB로 압축 될 수 있습니다. 그런 다음 LZMA2를 사용하여 Zip 파일을 압축하면 LZMA는 Zip보다 압축 가능한 데이터의 압축 비율높기 때문에 40 또는 45MB로 줄일 수 있습니다 . 따라서 Zip은 모든 엔트로피를 완전히 흡수하지 않기 때문에 Zip 데이터를 압축 할 수 있다고 추론합니다. 그러나 Zip 컨테이너를 완전히 제거하면 LZMA2를 사용하여 원시 텍스트를 압축하여 30-35MB 정도의 결과를 얻을 수 있습니다 (이는 개념을 설명하기 위해 "공기 번호"임). .

이 바이너리의 경우 압축하려는 경우 7-Zip 파일 형식은 자체 내부 구조를 작성하고 이미 압축 된 실행 파일의 데이터를 7-Zip 형식으로 압축해야하기 때문에 더 큽니다 . 여기에는 사전, 파일 헤더 등이 포함됩니다. 이러한 추가 데이터는 일반적으로 데이터 자체를 압축함으로써 절약되는 것 이상으로 상쇄되지만 압축하려는 실행 파일은 이미 LZMA 형식으로 압축 된 것으로 보입니다. 그렇지 않으면 실행 파일의 크기를 줄이거 나 2MB (많은)만큼 늘리지 않고 약간 증가시킬 수 있습니다.


"이것은 사전, 파일 헤더 등을 포함합니다. 이러한 추가 데이터는 일반적으로 데이터 자체를 압축하는 비용을 절약함으로써 상쇄되는 것 이상입니다. 압축하려는 실행 파일이 이미 LZMA 형식으로 압축 된 것
같습니다

6
@jhocking : 아닙니다. 가장 중요한 부분은 중간입니다. "사용하는 모든 압축 프로그램은 입력 크기를 늘릴 것입니다." 7zip의 파일 형식에는 사전 / 파일 헤더 / 등이 있지만 7zip에는 그러한 것들이없는 알고리즘을 사용하더라도 일부 (사실 대부분의) 입력에는 다음과 같은 출력이 있습니다. 입력 자체보다 크거나 큽니다. 이것은 정보 이론의 기본 사실이며 파일 헤더와 관련이 없습니다.
BlueRaja-대니 Pflughoeft

2
@Mehrdad 물론 : 항상 원래 입력을 반환하는 "압축"알고리즘을 작성하십시오. 그곳에; 끝난. : P ... 그 외에, 아니 - 모두에서 알고리즘의 모든 압축 알고리즘을해야 할 것입니다 일부 는 파일이 압축되어 있는지 어떤지를 나타냅니다 파일의 시작에서 하나의 비트는 경우에도 메타 데이터 (0 == 비 압축, 1 == 압축). AT ALL 파일의 내용을 수정 하려면 일부 메타 데이터 가 필요 합니다. 내용을 수정하는 경우 일부 입력을 더 크게 만듭니다.
allquixotic

1
그러나 귀하의 질문에 "고정 된 양의 메타 데이터를 넘어서 입력 길이를 늘리지 않는 압축 알고리즘이 있습니까?"라는 대답은 다음과 같습니다. 모르겠습니다. 그러나 이론적으로는 가능합니다. 실제로는 쉽습니다. 당신이해야 할 수있는 컨테이너 포맷 개발입니다 원본 파일 포함 또는 압축 된 데이터 스트림을. 그런 다음 아카이브를 생성 할 때 압축을 시도하십시오. 압축 된 크기가 입력보다 크면 원래 입력을 저장하고 메타 데이터를 앞에 포장하십시오. 파일 크기는 커지지 만 메타 데이터가 작 으면 (계속)
allquixotic

2
@Mehrdad : "입력 길이를 늘리지 않는 압축 알고리즘 (그러나 열악한)이 있습니까? "-대답은 "아니오"입니다. 2^(n+1)-1크기가 n 비트 이하인 메시지 가 있습니다. 우리의 알고리즘은 이들 각각을 고유 한 출력으로 매핑해야합니다 . 이 중 하나라도 비트 수가 적은 값에 매핑되면 다른 값은 반드시 더 많은 값에 매핑되어야합니다.
BlueRaja-대니 Pflughoeft

7

7z에서 사용되는 기본 압축 알고리즘은 무손실 입니다. 즉, 파일을 여러 번 반복적으로 압축 압축 해제 할 수 있습니다. 또한 각 반복 후에 파일은 정확히 동일 하게 유지 됩니다 .

불행히도, 항상 긍정적 인 결과 로 무손실 압축 알고리즘을 여러 번 적용 할 수는 없습니다 . 건너 뛸 수없는 엄격한 경계가 있습니다. 대략이 경계는 입력 시퀀스가 ​​무작위 데이터를 얼마나 밀접하게 앙상블하는지에 달려 있습니다. 무엇보다도 손실없는 알고리즘은 파일 압축, 인터넷 HTML 데이터 전송, 백업 및 출력 파일이 정확히 동일한 원본 입력 파일로 압축 해제 될 것으로 예상되는 기타 작업에 사용됩니다.

대조적으로 무손실 압축, 당신은 항상로 압축 후 파일 크기 감소를 기대할 수 lossful (또는 손실) 압축 알고리즘을 . 단점은 단일 압축 압축 풀기 반복 후에 원본 파일을 정확하게 복원 할 수 없다는 입니다. 이 알고리즘은 오디오 / 비디오 / 이미지 전송 및 저장에 가장 유명합니다.

7z 형식에서 사용되는 bzip2 , LZMA , LZMA2 및 기타 알고리즘 은 모두 무손실 입니다. 따라서 더 이상 압축 할 수없는 한계가 있습니다. 또한 실행 가능 이미지 (.exe)는 일반적으로 압축률이 높은 파일입니다. 7zip과 많은 다른 압축 도구로 실제로 출력 파일이 더 크게 만들 수있는 메타 데이터를 포함합니다.

브레인 티저 : 파일 크기를 항상 줄일 수있는 무손실 알고리즘이 있다면 어떨까요?

이 경우 압축 파일이 입력 파일보다 작다는 것을 항상 알 수 있습니다. 이것이 불가능한 이유는 다음과 같습니다.


5
오염에 의한 증거. 가설 : 무손실 알고리즘으로 항상 파일을 압축 할 수 있다고 가정합니다. 1 단계. 단일 압축은 출력 파일을 최소 1 비트 작게 만듭니다. 그렇다면 여러 번 반복 한 후에는 2 비트 만있는 파일이 생깁니다. 2 단계 다음 반복에서는 1 비트 크기의 파일을 만듭니다. 3 단계 그러나 압축 알고리즘은 무손실이므로 유효한 압축 풀기가 하나만 허용됩니다. 분명히 1 개의 압축 비트에서 2 개의 원본 비트를 복원 할 수 없습니다. 추측해야합니다. 마지막 요점은 가설을 위반하는 것입니다.
oleksii

파일을 더 작게 만드는 알고리즘을 보장 할 수는 없지만 이러한 경우 "압축"을 적용하지 않아도 크기를 늘리지 않는 알고리즘을 보장 할 수 있습니다. 실제로 파일 크기를 늘리지 않으려면 대역 외 (예 : 파일 이름)를 표시해야합니다.
jeteon

@ jeteon 나는 당신이 무엇을 말하려고하는지 잘 모르겠습니다.
oleksii

나는 단지 입력을 압축하지 않는 옵션을 가지고 있기 때문에 파일을 전혀 압축하지 않는 압축 프로그램을 가질 수 있다고 덧붙였다. 기본적으로 압축 버전이 압축되지 않은 버전보다 크다고 판단되면 그대로 두십시오. 그런 다음 압축 파일이 압축되지 않았다는 것을 압축 풀기 프로그램이 알 수 있도록 출력 크기에 추가하지 않고이 경우를 표시해야합니다. 파일 크기를 늘리지 않고이 작업을 수행하는 유일한 방법은 파일 이름 변경과 같은 작업을 수행하는 것입니다.
jeteon

@jeteon 아, 알겠습니다. 그렇습니다.
oleksii

6

원본 실행 파일이 이미 압축되어 있거나 압축 된 데이터 나 압축 할 수없는 데이터가 포함되어 있으면 압축하면 크기가 커집니다.


2

대부분의 압축 알고리즘은 기본적으로 심볼 테이블이라고하는 것을 사용합니다. 기본적으로 압축 할 수있는 요소로 사용하는 파일의 조각입니다 . 물론 파일에 약간의 오버 헤드가 발생하지만 일반적으로 파일 크기가 훨씬 작습니다.

이미 압축 된 파일에서는 여전히 심볼 세트를 생성하지만 크기를 줄일 수있는 것은 거의 없습니다. 귀하의 경우, 이미 압축 된 파일의 심볼 테이블은 아마도 2MB 또는 그 이상일 것입니다.


0

압축 아이디어 :

압축 소프트웨어는 파일 목록을 작성하고 중복 컨텐츠를 제거합니다.

이미 압축 파일을 압축하면 압축 파일이 원본보다 커질 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.