왜 Python으로 만든 tar.xz 파일이 기본 tar로 만든 파일보다 작나요?
(superuser.com)- 파이썬 tarfile 함수로 만든 파일보다 macOS tar로 만든 파일이 15배 크게 나옴
- 원인 : BSD/GNU tar는 압축 파일안에 파일을 순서 없이 넣기 때문에 파일의 종류에 따라 압축률이 떨어질 수도 있다는 것
ㅤ→ 파이썬 tarfile 함수는 기본값이 정렬
- GNU tar 의 경우 --sort 옵션으로 name/inode 순으로 정렬해서 넣는게 가능 → 정렬 적용시 같은 압축률
사용하고 있는 알고리즘은 Deflate이고요. 이는 이전에 압축에 사용했던 내용을 슬라이딩 윈도우에 담고 있습니다. 이번에 10바이트를 처리했으면 슬라이딩 윈도우에는 현재 처리한 10바이트가 마지막에 추가되는 식으로 관리되고 슬라이딩 윈도우의 크기는 고정입니다.
슬라이딩 윈도우에 담은 내용과 같은 내용이 발견되면 LLD (Literal, Lengh, Distance)를 대신 적어 압축을 하는 방식입니다. Distance는 슬라이딩 윈도우의 어디부터 같은 내용인지, Lengh는 슬라이딩 윈도우에서 같은 내용의 길이, Literal은 같지 않은 첫번째 글자입니다.
Deflate는 슬라이딩 윈도우에 뭘 담고 있는지가 중요하기 때문에 유사한 내용을 직전에 보았는지가 중요하고 유사한 파일을 보았으면 더 압축을 잘할 가능성이 있습니다.
이떤 방식으로 압축되는지는 아래 슬라이스를 참조해주세요. (gzip도 Deflate 기반입니다.)
https://speakerdeck.com/dalinaum/…
같은 폴더내에서 같은 이름/비슷한 이름을 가진 파일들의 내용은 비슷해서 압축률이 높을텐데,
압축할 때 이 같은 것들을 찾는 범위가 아주 넓지 않아서, 파일을 정렬하면 이 비슷한 것들이 모여서 압축된 확률이 높아질 것 같다는 얘기인듯 합니다.