많은 유사한 PNG 이미지의 이러한 (무손실) 압축 방법이 효과가없는 이유는 무엇입니까?


21

방금 다음과 같은 일이 발생했습니다 .PNG 이미지의 동일한 사본을 폴더에 여러 개 넣고 다음 방법으로 해당 폴더를 압축하려고했습니다.

  • tar czf folder.tar.gz folder/
  • tar cf folder.tar folder/ && xz --stdout folder.tar > folder.tar.xz (이것은 동일한 이미지에서는 잘 작동하지만 비슷한 이미지에서는 게인이 0입니다)
  • zip -r folder.zip folder/

나는의 크기를 선택하면 .tar.gz, .tar.xz, .zip나는 거의의 것과 동일하다는 것을 깨달았다 folder/.
png 이미지 자체의 압축 수준이 높을 수 있으므로 더 이상 압축 할 수 없음을 이해합니다. 그러나 많은 유사한 (이 경우에도 동일한) png 이미지를 아카이브에 병합 한 다음 아카이브를 압축하면 필요한 크기가 현저하게 줄어 듭니다. 동일한 이미지의 경우 대략 단일 이미지의 크기를 기대합니다.


2
이 동작은 png 파일에만 있습니까?
pdexter

7
대답하지 않은 질문에 대한 답변 으로이 답변을하지는 않지만 거의 동일한 이미지를 많이 압축한다는 것을 알고 있다면 첫 번째 이미지에 대해 첫 번째 이미지를 제외한 모든 이미지를 항상 이진 diff로 바꿀 수 있습니다. 이미지에 노이즈가 없다고 가정하면 압축 가능한 출력이 생겨 원본 이미지를 여전히 재현 할 수 있습니다.
Baldrickk

압축되지 않은 파일 (예 .bmp:) 을 사용하는 경우 tar.gz 파일은 유사성을 활용할 수 있어야합니다. (적어도 유사성이 많은 픽셀이 동일한 경우)
코드 InChaos

1
나는 그것에 대해 아무것도 모른다. 그러나 Wikipedia에 따르면, "ZPAQ"아카이브 형식은 중복 제거를 지원한다. en.wikipedia.org/wiki/ZPAQ#Deduplication
coneslayer

이미 압축 된 것을 압축하려고합니다. 여기를보십시오
Kyle Khalaf

답변:


34

압축 알고리즘의 작동 방식을 살펴보십시오. 렘펠 - 지브 제품군의 그 적어도 것은 ( gzip LZ77를 사용 , zip분명히 대부분 뿐만 아니라 수행xz 사용 LZMA ) 압축 다소 로컬 : 멀리 떨어져 서로 캔 식별 할 수없는에서 거짓말 상사.

세부 사항은 방법마다 다르지만 결론은 알고리즘이 두 번째 이미지에 도달 할 때 이미 첫 번째 이미지의 시작 부분을 "잊어 버렸다"는 것입니다. 등등.

압축 방법의 매개 변수를 수동으로 변경하려고 시도 할 수 있습니다. 창 크기 (LZ77)에 해당하는 경우 블록 / 청크 크기 (나중의 방법)는 최소한 두 개의 이미지만큼 크므로 추가 압축이 표시 될 수 있습니다.


위의 이미지 는 압축되지 않은 이미지 가 동일 하거나 거의 동일한 경우에만 실제로 적용됩니다 . 차이가 있으면 압축 된 이미지가 메모리에서 다르게 보일 수 있습니다. PNG 압축이 어떻게 작동하는지 모르겠습니다. 공유 서브 스트링에 대한 이미지의 16 진 표현을 수동으로 점검 할 수 있습니다.

또한 매개 변수가 변경되고 악용되는 중복성이 있어도 하나의 이미지 크기로 축소되지 않습니다. 큰 사전은 더 큰 코드 워드 크기를 의미하며 두 이미지가 정확히 동일하더라도 두 번째 이미지는 첫 번째를 가리키는 여러 코드 워드를 사용하여 두 번째 이미지를 인코딩해야 할 수도 있습니다.


3
보다 정확한 답변 : gzip 및 zip은 LZ77 + Huffman 이론을 기반으로하는 동일한 기본 DEFLATE 코덱을 사용합니다.
Nayuki

예! 그것은 이야기의 절반입니다. 참조 내 대답 나머지 절반에 대한, 또는 Nayuki의 훌륭한 대답을 .
DW

1
하나의 덩어리와 압축으로 파일을 연결하여 파일 간의 중복을 악용 아카이브 형식 : 후세를위한 불린다 고체 . 중간 수준의 '고체 성'등에 대한 다른 용어가 있는지 확실하지 않습니다.
underscore_d

22

왜 이런 일이 발생합니다. 실제로 두 가지 다른 효과가 발생합니다.

  • 각 파일은 독립적으로 압축되었습니다. zip을 포함한 일부 아카이브 프로그램은 한 파일에서 다른 파일로의 메모리없이 각 파일을 독립적으로 압축합니다. 즉, 각 파일은 개별적으로 압축 된 다음 압축 된 파일이 아카이브로 연결됩니다.

  • 단기 기억. 일부 아카이브 프로그램은 한 파일에 대한 정보를 사용하여 다음 파일을 더 잘 압축 할 수 있습니다. 파일을 효과적으로 연결 한 다음 결과를 압축합니다. 이것은 개선입니다.

    이에 대한 자세한 내용은 Nayuki의 답변 을 참조하십시오 .

    그러나 두 번째 문제가 있습니다. zip, gzip 및 bzip2를 포함한 일부 압축 체계에는 메모리가 제한되어 있습니다. 즉석에서 데이터를 압축하고 지난 32KB의 데이터를 기억하지만 파일에서 훨씬 이전에 발생한 데이터에 대해서는 아무 것도 기억하지 않습니다. 즉, 중복이 32KB 이상 떨어져 있으면 중복 된 데이터를 찾을 수 없습니다. 결과적으로 동일한 파일이 짧으면 (약 32KB보다 짧음) 압축 알고리즘이 중복 된 데이터를 제거 할 수 있지만 동일한 파일이 길면 압축 알고리즘이 중단되어 무가치하게됩니다. 데이터 중복. Bzip은 32KB 대신 과거 900KB 정도의 데이터를 기억합니다.

    모든 표준 압축 알고리즘이 어떤 그들이 패턴을 감지하는 데 실패하는 이상 최대 메모리 크기를 ...하지만 일부,이 숫자는 다른 사람보다 훨씬 더 크다. Bzip의 경우 900KB와 같습니다. xz의 경우 8MB와 같습니다 (기본 설정 사용). 7z의 경우 2GB와 같습니다. 2GB는 PNG 파일의 복제 된 사본 (일반적으로 2GB보다 훨씬 작음)을 인식하기에 충분히 큽니다. 또한, 7z는 압축기에서 서로 더 잘 작동 할 수 있도록 아카이브에서 서로 비슷한 파일을 배치하는 것에 대해 현명하게 노력합니다. 타르는 그것에 대해 아무것도 모른다.

    참조 라파엘의 대답Nayuki의 대답 이 효과 더 설명에 대한합니다.

이것이 설정에 적용되는 방식. 구체적인 예를 들어 PNG 이미지로 작업하고 있습니다. PNG 이미지 자체는 압축되어 있으므로 각 PNG 파일을 기본적으로 파일 내에서 패턴이나 복제가없는 무작위로 보이는 바이트 시퀀스로 생각할 수 있습니다. 단일 PNG 이미지를 보면 압축기가 악용 할 수있는 것은 없습니다. 따라서 단일 PNG 파일을 압축하거나 단일 PNG 파일 만 포함하는 zip / tar / ... 아카이브를 만들려고하면 압축되지 않습니다.

이제 동일한 PNG 파일의 여러 복사본을 저장하려고하면 어떻게되는지 살펴 보겠습니다.

  • 작은 파일. PNG 파일이 매우 작 으면 zip을 제외한 모든 것이 잘 작동합니다. Zip은 놀라 울 정도로 실패합니다. 각 파일을 독립적으로 압축하므로 파일 간의 중복 / 중복을 감지 할 수 없습니다. 또한 각 PNG 파일을 압축하려고 할 때 압축이 이루어지지 않습니다. Zip 보관 파일의 크기는 엄청납니다. 반대로 tar 아카이브 (gzip, bzip2 또는 xz로 압축되어 있는지 여부)와 7z 아카이브의 크기는 기본적으로 파일의 사본 하나를 저장 한 후 나머지는 모두 동일하다는 것을 알기 때문에 크기가 작습니다. 한 파일에서 다른 파일로 메모리를 유지합니다.

  • 큰 파일. PNG 파일이 크면 7z 만 잘 작동합니다. 특히 지퍼는 계속해서 실패합니다. 또한 파일 크기가 압축기의 메모리 창보다 크기 때문에 tar.zip 및 tar.bzip2가 잘못 실패합니다. 압축기가 파일의 첫 번째 사본을 볼 때 파일을 축소 할 수 없습니다 (이미 압축되어 있기 때문에) ); 파일의 두 번째 사본의 시작 부분을 볼 때까지는 첫 번째 파일의 시작 부분에 표시된 바이트 순서를 이미 잊어 버렸으며이 데이터가 실제로 복제본이라는 연결을 만들 수 없습니다.

    반대로 tar.xz 및 7z는 큰 PNG 파일의 여러 복사본으로 계속 훌륭하게 작동합니다. "소형 메모리 크기"제한이 없으며 파일의 두 번째 사본이 첫 번째 사본과 동일하다는 것을 알 수 있으므로 두 번째로 저장할 필요가 없습니다.

이것에 대해 할 수있는 것. 7z를 사용하십시오. 그것은 동일하거나 유사한 파일을 탐지하고 그 경우 실제로 잘 압축하는 데 도움이되는 많은 휴리스틱을 가지고 있습니다. lzop 압축을 사용하여 lrzip을 볼 수도 있습니다.

내가 어떻게 알아? 임의 바이트를 포함하는 파일의 100 복사본으로 실험을 시도하여 이것을 확인할 수있었습니다. 4KB 파일 100 매, 1MB 파일 100 매, 16MB 파일 100 매를 시도했습니다. 내가 찾은 것은 다음과 같습니다.

Size of file      Size of compressed archive (with 100 copies)
                  zip  tar.gz  tar.bz2  tar.xz    7z
         4KB    414KB     8KB     10KB     5KB    5KB
         1MB    101MB   101MB    101MB     1MB    2MB
        16MB    1.6G    1.6GB    1.6GB   1.6GB  401MB

보시다시피, 파일 크기가 작더라도 zip은 끔찍합니다. 이미지가 너무 크지 않으면 7z와 xz가 모두 좋습니다 (그러나 xz는 깨지기 쉬우 며 일부 복제본과 중복되지 않은 일부가 혼합 된 경우 이미지가 아카이브에 배치되는 순서에 따라 달라집니다). 큰 파일의 경우에도 7z는 꽤 훌륭합니다.

참고 문헌. 이것은 또한 수퍼 유저의 여러 게시물에서 잘 설명되어 있습니다. 보세요:


5
ZIP 형식은 1990 년경에 다시 설계되었다는 점을 명심해야 할 수도 있습니다 (PKZIP는 1989 년에 ZIP 형식을 도입했으며 Wikipedia는 DEFLATE가 1993 년에 도입되었습니다). 이 기간 동안 합리적으로 일반적인 PC는 286 또는 386 일 수 있었으며 (486은 1989 년에 도입되었지만 항상 그렇듯이 따라 잡는 데 시간이 걸렸습니다) 아마도 2-4MB의 RAM으로 DOS를 실행했을 것입니다. 500KB는 영리한 프로그래밍 (EMS, XMS) 지원없이 직접 사용할 수 있었으며 사용 가능한 것은 아닙니다. 이 환경에서는 작은 압축 창 크기가 거의 필요했습니다.
CVn

"각 파일이 독립적으로 압축 됨"-표준과 도구에 따라 크게 달라집니다. 우분투의 기본 패키징 소프트웨어에 대한 나의 경험은 아카이브를 열 때 모든 것을 압축 해제하는 것 같습니다. 유용성 향상이 일반적으로 압축 단점을 능가하기 때문에 모든 파일을 독립적으로 압축 해야한다고 생각했습니다 .
Raphael

"임의의 바이트를 포함하는 파일의 100 개 사본"- "유사한"파일은 어떻습니까? (실제 질문 향해 어떻게 유사한 있습니다 비슷한 이미지의 PNG 파일?)
라파엘

라파엘은 그의 대답에서 이것에 대해 좋은 지적을했습니다. 실제로 저장하려는 비슷한 (동일하지 않은) 많은 이미지가 있습니다. 그것들은 비슷한 측면에서 (강도와 배경에 관해서도) 약간의 변화가있는 동일한 구조를 보여줍니다. 그러나 그 차이는 너무 작아서 거의 보이지 않습니다. 나는 tar그들에게 시도한 다음 압축하여 xz(동일한 이미지에 매우 효과적) 비슷한 이미지의 경우 게인은 0입니다. 크기가 ~ 831KB 인 71 개의 이미지로 시도했습니다.
a_guest

2
@a_guest-잘 안될거야. 비슷한 모양의 PNG 이미지는 PNG 압축으로 인해 바이트 내용이 매우 다릅니다. superuser.com/q/730592/93541 , superuser.com/q/418286/93541 , superuser.com/q/893206/93541 , superuser.com/q/921140/93541 도 참조하십시오 -기본적으로 좋은 솔루션은 없습니다.
DW

10

첫째, PNG 이미지 형식은 기본적으로 DEFLATE 압축 형식을 통해 푸시 된 원시 RGB 픽셀 (일부 광 필터링 포함)입니다. 일반적으로 압축 파일 (PNG, JPEG, MP3 등)은 다시 압축하면 이점이 없습니다. 실제적인 의도를 위해 PNG 파일을 실험의 나머지 기간 동안 압축 할 수없는 무작위 데이터로 취급 할 수 있습니다.

둘째, ZIP 및 gzip 형식도 DEFLATE 코덱을 사용합니다. (이것은 단일 파일의 압축과 gzipping이 본질적으로 동일한 출력 크기를 생성하는 이유를 설명합니다.)


이제 각 테스트 사례에 대해 개별적으로 의견을 제시 할 수 있습니다.

  • tar czf folder.tar.gz folder/

    이렇게하면 (소량의 메타 데이터와 패딩이 추가 된) 모든 동일한 PNG 파일을 연결하는 압축되지 않은 TAR 파일이 생성됩니다. 그런 다음이 단일 파일은 gzip 압축기를 통해 전송되어 하나의 압축 된 출력 파일을 작성합니다.

    불행하게도, DEFLATE 형식은 32768 바이트의 LZ77 사전 창만 지원합니다. 따라서 TAR에 반복적 인 데이터가 포함되어 있어도 PNG 파일이 32KiB보다 큰 경우 DEFLATE 압축기는 동일한 데이터가 반복된다는 사실을 이용하기에 충분한 데이터를 기억할 수 없습니다.

    반면에 20KB PNG 파일이 10 번 복제 된 상태로이 실험을 다시 시도하면 20KB보다 약간 큰 gzip 파일을 얻을 가능성이 큽니다.

  • tar cf folder.tar folder/ && xz --stdout folder.tar > folder.tar.xz

    이전과 마찬가지로 TAR 파일을 만든 다음 xz 형식과 LZMA / LZMA2 압축기를 사용합니다. 이 상황에서 LZMA에 대한 정보를 찾을 수 없지만 Windows 용 7-Zip에서 큰 사전 창 크기 (예 : 64 MiB)를 지원할 수 있다는 것을 알고 있습니다. 따라서 최적이 아닌 설정을 사용하고 LZMA 코덱이 TAR 파일을 하나의 PNG 파일 크기로 줄일 수 있었을 수 있습니다.

  • zip -r folder.zip folder/

    ZIP 형식은 "단단한"아카이브를 지원하지 않습니다. 즉, 모든 파일은 독립적으로 압축됩니다. 모든 파일은 압축 할 수 없다고 가정했습니다. 따라서 모든 파일이 동일하다는 사실을 악용 할 수 없으며 ZIP 파일은 모든 파일을 직접 연결하는 것만 큼 큽니다.


xz기본적 xz -6으로 8 MiB LZMA2 사전 을 사용하는 모드에서 실행됩니다 . 데비안 시스템의 맨 페이지에서 컴프레서의 기본 창 크기를 즉시 찾을 수 없었습니다.
CVn

좋은 대답입니다! 두 번째 경우에는 실제로 다음을 수행했습니다. tar czf folder.tar.gz folder/ && xz --stdout folder.tar.gz > folder.tar.gz.xz효과없이 (설명한 내용에 따라 의미가 있습니다). 나는이 압축 파일에서 조금 길을 잃었다 고 생각한다 tar cf folder.tar folder/ && xz --stdout folder.tar > folder.tar.xz. 그에 따라 내 질문을 업데이트했습니다. 감사!
a_guest

@a_guest 좋아요, 여러분의 의견은 다른 두 번째 경우를 설명합니다. 문제 tar -> gzip -> xz는 gzip DEFLATE에서 PNG 데이터의 각 사본을 다른 방식으로 압축 할 수 있으므로 xz는 중복성을 감지 할 수 없다는 것입니다.
Nayuki

6

문제는 (대부분의) 압축 체계에 데이터에 대한 지식이 부족하다는 것입니다. PNG를 압축 해제하여 타르볼에서 압축하더라도 결과가 더 작아지지는 않습니다.

많은 유사한 이미지의 경우 적절한 압축 방식은 비디오 코덱입니다.

무손실 코딩을 사용하면 거의 완벽한 압축 결과를 얻을 수 있습니다.

테스트하려면 다음과 같이 사용하십시오.

ffmpeg -i img%03d.png -c:v libx264 -c:v libx264 -profile:v high444 -crf 0 out.mp4

https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images


비디오 엔코더를 사용하는 것이 좋습니다! 우분투 원인 14.04를 업그레이드 할 때 기본적으로 ffmpeg가 포함되어 있지 않습니다. 이 비디오 엔코더가 무손실 압축을 사용하고 있거나 적어도 스위치가 있습니까? 당신은 알고 있습니까?
a_guest

예, -crf 0은 손실이 없습니다 (또는 문서에서 언급 한 것처럼 -qp 0도 동일합니다 (-qp 0이 선호 됨)). trac.ffmpeg.org/wiki/Encode/H.264
Jonas

4

PNG는 Filters + LZ77 + Huffman (LZ77 + Huffman의 조합을 Deflate라고 함)의 조합입니다.

1 단계) 필터가 없음과 다른 경우, 픽셀 값이 인접 픽셀과의 차이로 대체됩니다 (자세한 내용은 http://www.libpng.org/pub/png/book/chapter09.html 참조 ) . 그래디언트가있는 이미지의 압축이 증가하므로 (4 5 6 7은 ... 1 1 1 1이 됨) 동일한 색상의 영역에 도움이 될 수 있습니다 (... 3 3 3 5 5 5 5 5는 0이 됨) 0 2 0 0 0 0 0). 기본적으로 필터는 24 비트 이미지에서 활성화되고 팔레트가있는 8 비트 이미지에서 비활성화됩니다.

단계 2) 데이터는 LZ77으로 압축되어 반복되는 (일치하는) 바이트 문자열을 일치하는 거리와 일치하는 길이를 포함하는 튜플로 대체합니다.

단계 3) 단계 2의 결과는 고정 길이 심볼을 가변 길이 코드로 대체하는 허프만 코드로 인코딩되며, 심볼이 빈번할수록 코드는 짧아진다.

여러 가지 문제가 있습니다.

소수의 픽셀에 영향을주는 작은 변화는 3 단계의 png 압축 결과에서 변화를 가져옵니다.

1) 인접 픽셀의 필터링 된 값이 변경됩니다 (사용 된 필터에 따라 다름). 그것은 작은 변화의 영향을 증폭시킬 것입니다.

2) 변경 사항은 해당 지역과 일치하는 것이 다르다는 것을 의미합니다. 예를 들어, 333333을 333533으로 변경하면 333333의 다른 발생이 더 이상 일치하지 않으므로 거리가 다른 333333에 대한 다른 일치를 선택하거나 동일한 일치를 선택하지만 길이는 더 짧고 마지막 3 바이트에 대해서는 다른 일치를 선택합니다. 그 자체로 결과가 많이 바뀔 것입니다.

3) 가장 큰 문제는 3 단계입니다. 허프만 코드는 가변 비트 수를 사용하므로 약간만 변경해도 뒤 따르는 모든 것이 더 이상 정렬되지 않습니다. AFAIK 대부분의 압축 알고리즘은 바이트 정렬되지 않은 일치를 감지 할 수 없으므로 압축기가 바이트 정렬되지 않은 일치를 감지 할 수 없으면 변경을 따르는 이미 압축 된 데이터에 대한 압축을 방지 (또는 최소한 많이 감소)합니다.

다른 문제는 이미 다른 답변에서 다룹니다.

4) Gzip은 32KB 사전과 동일한 Deflate 알고리즘을 사용하므로 png 파일이 32KB보다 크면 일치하더라도 일치가 감지되지 않습니다. Bzip2는 900KB 블록을 사용하므로 이러한 측면에서 더 좋습니다. XZ는 LZMA를 사용하는데, IIRC는 기본 압축 수준에서 4MB 사전을 갖습니다. 5) Zip 형식은 압축을 사용하지 않으므로 유사하거나 동일한 파일을 더 잘 압축하지 않습니다.

PAQ 또는 PPMD ​​제품군의 압축기는 압축률이 높지만 유사한 이미지 파일을 많이 압축해야하는 경우 다음 3 가지 방법을 고려할 수 있습니다.

1) 이미지를 압축되지 않은 상태로 저장하고 (PNG -0 또는 압축없는 형식으로) 사전 또는 블록 크기가 큰 압축기로 압축합니다. (LZMA는 잘 작동합니다)

2) 다른 옵션은 필터를 유지하지만 PNG에서 수축 압축을 제거하는 것입니다. 예를 들어 ( AdvDef ) 유틸리티 를 사용하여 수행 할 수 있습니다 . 그런 다음 압축되지 않은 PNG를 압축합니다. 압축 해제 후 압축되지 않은 PNG를 유지하거나 AdvDef를 사용하여 다시 압축 할 수 있지만 시간이 오래 걸립니다.

어떤 압축 방식을 가장 많이 사용하는지 확인하려면 두 가지 접근 방식을 모두 테스트해야합니다.

3) 마지막 옵션은 비디오에서 png 이미지를 변환하고 x264 무손실 (올바른 색상 형식을 사용하여 특별한주의를 기울임)과 같은 무손실 비디오 압축기로 압축 한 다음 추출시 프레임을 개별 png 이미지로 추출하는 것입니다. 그것은 ffmpeg로 수행 할 수 있습니다. 또한 프레임 번호와 원래 이름 사이의 매핑을 유지해야합니다.

가장 복잡한 방법이지만 PNG가 모두 애니메이션의 일부인 경우 가장 효과적 일 수 있습니다. 그러나 필요한 경우 투명도를 지원하는 비디오 형식이 필요합니다.

편집 : 자주 사용하지 않는 MNG 형식도 있습니다.


2

특수 데이터 세트가있는 경우 다목적 도구가 아닌 특수 알고리즘을 사용합니다.

정답은 선택한 무손실 압축이 수행 한 작업에 적합하지 않다는 것입니다. 아무도 당신이 동일한 이미지를 두 번 압축 할 것으로 기대하지 않으며, 실수로 실수로 이전의 모든 입력을 검사해도 알고리즘이 O (n ^ 2)가 될 수 있습니다 (약간 나아질 수 있지만 naiv 접근 방식은 n ^입니다) 2).

테스트 한 대부분의 압축 프로그램은 O (n)로 실행되며 최적의 압축 비율보다 속도를 강조합니다. 아무도 요즘 몇 메가 바이트를 아끼기 위해 컴퓨터를 5 시간 동안 운영하고 싶지 않습니다. 더 큰 입력의 경우 O (n) 이상은 런타임 문제가됩니다.

또 다른 문제는 램입니다. 입력이 충분히 커지면 언제든지 입력의 모든 부분에 액세스 할 수 없습니다. 이것을 무시하더라도 대부분의 사람들은 무언가를 압축하기 위해 전체 램이나 CPU를 포기하고 싶지 않습니다.

파일에 압축하려는 패턴이있는 경우 파일에 대해 마누엘 작업을 수행하거나 직접 압축을 작성하거나 잠재적으로 "아카이브"유형 압축 (nano)을 사용해야합니다. 장기 보관을위한 압축으로 일상적인 사용에는 너무 느립니다.

다른 옵션은 무손실 비디오 압축입니다.


1
디렉토리 구조가 서로 다른 위치에 여러 개의 동일한 파일을 포함하는 것이 매우 흔하기 때문에 압축에 적합한 파일이 압축 / 압축되지 않은 해시 값과 크기를 갖는지 여부를 확인하는 옵션을 제공해야합니다. 기존 파일과 일치합니다. 해시와 크기가 모두 일치하면 첫 번째 파일과 관련된 데이터 블록에 두 번째 이름을 추가하는 것이 좋습니다. ZIP이이를 수용 할 수 없더라도 향후 형식에서 유용한 기능으로 보입니다.
supercat

1
귀하의 답변은 tar의 압축 알고리즘이 일부 종류의 중복성을 압축하는 데는 좋지만 OP 시나리오에서 발생하는 종류에는 적합하지 않음을 나타냅니다. 당신은 당신이 생각하는 중복의 종류에 대해 설명 할 수 있다 즉 모든 명백한에 있지이기 때문에, 좋은. 아마도이 압축기를 성공적으로 사용하지 않은 사람에게는 이론상으로 압축 할 수있는 것으로 시도했지만 작동하지 않았기 때문에 어쨌든이 압축기는 무엇입니까?
돈 해치

1
@ leftaroundabout : 유닉스에서 필자가 "copy-on-write"의미를 일치하는 파일과 함께 사용하는 방법은 없습니다. 많은 경우에, 오늘날 동일 할 수도 있고 내일 동일하지 않을 수도 있다는 사실을 다루기 위해 중복 사본이 존재하며, 그러한 경우에는 심볼릭 링크 나 하드 링크가 적절하지 않은 것으로 보입니다.
supercat

1
@supercat : 이러한 파일이 많으면 하나의 "공식적인"읽기 전용 버전에 대한 심볼릭 링크를 사용하는 것이 가장 좋습니다. 그런 다음 사본을 변경하려면 symlink를 실제 사본으로 바꾸십시오.
leftaroundabout

1
@leftaroundabout : 엔지니어링 해시 충돌의 위험을 허용 가능한 수준으로 줄일 수 있다면 해시 기반의 범용 참조 식별자를 사용하여 "논리적"파일 이름으로 심볼릭 링크하는 것이 아니라면 흥미로울 것입니다. 해시를 기반으로 링크를 만듭니다. 그런 다음 아카이브는 실제로 큰 파일을 저장하는 대신 256 바이트 정도의 해시를 저장합니다. 이러한 접근 방식의 변형을 사용하여 변경으로부터 보호해야하는 파일을 캐싱 할 수도 있습니다.
supercat

2

PNG 파일 형식은 이미 내부적으로 DEFLATE 압축 알고리즘을 사용합니다. 이것은 xz, gzip 및 zip에서 사용하는 것과 동일한 알고리즘입니다. tar.gz과하고 tar.xz있는 파일 사이의 유사성을 활용 zip하지 않습니다.

따라서 실제로 DEFLATE 압축 파일에 대해 DEFLATE 압축을 수행하므로 파일이 거의 원래 크기로 유지됩니다.

bzip2이 (거의) 동일한 파일에 관해서 프로그램 (또한 관련 알고리즘) 좋습니다.

# for i in $(seq 4); do cp test.png test$i.png; done
# tar -cjf archive.tar.bz2 *.png
# ls -l
-rw-r--r-- 1 abcde users  43813 15. Jul 08:45 test.png
-rw-r--r-- 1 abcde users  43813 15. Jul 08:45 test1.png
-rw-r--r-- 1 abcde users  43813 15. Jul 08:46 test2.png
-rw-r--r-- 1 abcde users  43813 15. Jul 08:46 test3.png
-rw-r--r-- 1 abcde users  43813 15. Jul 08:46 test4.png
-rw-r--r-- 1 abcde users  68115 15. Jul 08:47 archive.tar.bz2

PNG- 사용 된 비표준 디 플레이트 (어떤 것이 표준입니까?) 필터가 있으며 동일한 알고리즘을 두 번 실행하면 아무 것도 제공하지 않지만 (적어도 유익하지 않아야 함) 명심하십시오. 다른 설정을 가진 동일한 알고리즘이 실패하지는 않습니다. 또한 deflate32, deflate64, LZW, LZMA의 차이점이 있습니다. 모두 deflate를 사용한다고 말할 수는 없습니다.
Evil

그렇기 때문에 "일부 변형"이라고했습니다. 물론 DEFLATE는 특정 구현이 아닌 일종의 알고리즘을 말합니다.
rexkogitans

3
내가 이해할 때 요점을 놓친다. 예, 하나의 PNG 파일만으로 이미 압축되어 있으므로 어떤 종류의 압축도 더 이상 효과가 없을 것으로 예상됩니다. 그러나 여러 개의 동일한 PNG 파일 (본질적으로 여기에있는 상황)의 연결은 그 중 하나의 크기 이하로 압축 될 것으로 합리적으로 예상 될 수 있습니다.
돈 해치

분명히, 이러한 압축 알고리즘은 그 점을 놓칩니다. bzip2그것을 잡는다 : tar -cjf archive.tar.bz2 *.png. 내 답변에서 업데이트되었습니다.
rexkogitans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.