hooninedev.com
🦵
소박한궁금증소프트웨어

zip, gzip, zstd, bzip2, xz 등 소프트웨어의 압축 알고리즘에 대해 공부해보자!

2024.07.06

사내 프로젝트를 진행하며 build 폴더를 S3에 업로드하는 업무를 진행했다. 이 과정에서 build 폴더의 용량에 따라 시간, 금액이 차이가난다는 것을 알게되었다.

사내에서 프로젝트를 진행하면서 2GB가 넘는 build 폴더를 어떻게하면 효율적으로 S3에 업로드할 수 있을까라는 고민을 하게되었고, 그 과정속에서 압축에 대해 공부한 내용을 기록에 남기려한다.


무손실 압축(Lossless Compression)


2.jpeg


무손실 압축은 손실 압축과 달리 데이터 손실 없이 파일 크기를 줄이는 데이터 압축의 한 종류다. 무손실 압축의 핵심 아이디어는 파일에 있는 콘텐츠의 통계적 중복성을 활용하는 것으로 압축하는 동안 긴 기호를 더 짧은 표현으로 대체하여 데이터 크기를 줄인다.

여러가지 방법 중 Dictionary-Based algorithm은 무손실 압축을 수행하는 데 가장 널리 사용되는 알고리즘이다. 이 알고리즘은 포인터가 포함된 dictionary를 구축해 더 작은 포인터로 대체하는 방식이다.

쉽게 설명하면 Linux라는 단어가 계속 반복되는 경우 무손실 압축 방법은 문자 1Linux라는 단어에 매핑하는 맵을 만들어, 모든 Linux 단어를 문자 1로 포현한다. 이러면 더 적은 바이트가 필요하므로 압축 파일은 더 작아지게된다.

압축 성능을 향상시키는 방법은 압축으로 인해 원본 파일의 크기를 줄이는 압축률과 압축기간 2가지 있다. 화이트 노이즈와 같은 데이터가 있는 바이너리 파일에 비해 상대적으로 큰 압축률을 기대할 때는 압축률을 더 신경쓴다.

하지만 완벽한 압축 프로세스를 기획하기 위해서는 기간 측정도 중요하다. 왜냐하면 압축 기간과 압축률 간의 절충점 때문이다. 이론적으로 더 높은 압축률을 위해서 압축 시간이 더 오래걸려 수익화지표에 악영향을 끼칠 수 있기 때문이다.

그럼 차근차근 여러가지 압축방법들을 비교해보도록 하겠다. 비교 속성은 압축 알고리즘, 파일 시스템 호환성, 압축 비율, 사용 편의성, 커뮤니티 및 생태계를 비교해보도록 하겠다.


ZIP

ZIP 압축 알고리즘을 사용한다. 다양한 파일 형식을 하나의 파일로 묶고, 각각의 파일을 개별적으로 압축한다. 컴퓨터 관련 종사자가 아니여도, 가장 쉽게 접할 수 있다.

Windows, macOS, Unix-like 시스템 등 대부분의 운영체제에서 널리 지원된다. 그렇기에 접근성이 아주 뛰어나다. 압축 해제 시 파일 시스템에 따라 다를 수 있지만, 일반적으로 Unix-like 시스템에서 파일 권한을 어느 정도 유지한다.

일반적으로 적당한 압축 비율을 제공한다. 그러나 최신 압축 알고리즘에 비해 효율성이 떨어질 수 있기 때문에 압축 성능을 향상시켜야 되는 작업이면 다른 방법을 찾아보는 것도 방법이라고 생각한다.

이전에 말한대로 ZIP은 다양한 운영체제에서 기본적으로 지원되므로, 사용하기 매우 쉽다. 특히 Windows 시스템에서는 기본적으로 지원되어, 추가 소프트웨어 없이도 압축 파일을 열 수 있다.

일반적인 파일 아카이빙과 배포에 널리 사용된다. 특히, 크로스 플랫폼 호환성이 중요한 경우에 자주 사용된다.


🚨 Unix-like란?!

유닉스 유사 운영체제는 단일 유닉스 사양의 어떤 버전을 반드시 준수하거나 인증을 받은 것은 아니지만 유닉스 시스템과 유사한 방식으로 작동하는 운영체제다.

쉽게 말하면 유닉스 명령 또는 셸처럼 작동하는 애플리케이션을 의미한다.


GZIP(GNU Zip)

GZIP 압축 알고리즘을 사용하며, 주로 단일 파일을 압축하는 데 사용되고, 파일의 스트림을 압축한다.

Unix-like 시스템에서 널리 사용된다. Windows에서는 추가 소프트웨어가 필요할 수 있다.

좋은 압축 비율을 제공하는데, 특히 텍스트 파일에 대해 높은 압축률을 보인다.

단일 파일 압축에 매우 유용하지만, 여러 파일을 압축할 때는 TAR과 함께 사용해야 한다. 그렇기에 사용자는 tar와 gzip 명령을 조합하여 tar.gz 파일을 생성하는 데 익숙해야 한다. tar와 gzip을 조합해서 사내 build 폴더를 tar.gz으로 압축해서 S3에 업로드했다. 이렇게 작업을 하게 된 이유는 각 압축법을 비교한 후 마지막 세션에서 다시 이야기 할 예정이다!

Unix-like 시스템에서 소스 코드, 소프트웨어 패키지, 로그 파일 등을 압축하는 데 표준으로 사용된다.


ZSTD(Zstandard)

Facebook에서 개발한 최신 압축 알고리즘으로, 높은 압축률과 빠른 압축 및 해제 속도를 제공한다.

다양한 운영체제에서 사용할 수 있지만, Windows에서는 추가 소프트웨어가 필요할 수 있다. 그래서 운영체제를 확인해서 사용해야한다.

매우 높은 압축 비율을 제공하는데, 특히 대규모 데이터에 대해 효율적이다.

빠르고 효율적이지만, 비교적 다른 압축 형식보다 나중에 만들어져 덜 알려져 있다. zstd에서 사용되는 명령어가 있기에 사용하려면 별도의 러닝커브가 발생한다.

ZSTD는 최신 기술을 필요로 하는 데이터 집약적인 애플리케이션에서 인기를 얻고 있습니다. 오픈 소스 프로젝트 및 데이터 과학 커뮤니티에서 널리 사용됩니다.


BZIP2

Burrows-Wheeler 변환(BWT)과 무손실 데이터 압축을 위한 허프만 코딩(Huffman Coding)을 사용한다. BWT는 텍스트 데이터를 더 쉽게 압축할 수 있는 형식으로 변환하고, 허프만 코딩은 이 변환된 데이터를 효과적으로 압축한다.

GZIP보다 더 높은 압축률을 제공하지만, 압축 속도와 압축해제 속도가 느리다.

대부분의 Unix-like 시스템, macOS, Windows에서 지원된다. 여러 파일과 디렉토리를 압축하기 위해 TAR과 함께 사용한다.

주로 Unix-like 시스템에서 고압축률이 필요한 경우 사용된다. 소스 코드 배포 및 저장 공간 절약이 중요한 프로젝트에서 선호된다.


XZ

LZMA2 알고리즘을 사용하는데, LZMA2는 Lempel-Ziv-Markov chain 알고리즘의 개선된 버전으로, 매우 높은 압축률을 제공한다.

압축률이 매우 높아 BZIP2보다 더 높은 압축률을 필요할 때 사용한다. 그 대신 압축 속도가 느리고, 압축 해제 속도는 적당한편이다.

대부분의 Unix-like 시스템, macOS, Windows에서 지원된다.


TAR

TAR 자체는 압축 알고리즘이 아니고, 파일 및 디렉토리를 하나의 파일로 묶는 용도로 사용되며, 보통 GZIP이나 BZIP2, ZSTD에 사용된다.

Unix-like 시스템에서 파일 권한과 소유권을 보존한다. 그리고 Windows에서는 추가 소프트웨어가 필요하다.

TAR 자체는 압축을 제공하지 않지만, GZIP 등과 함께 사용하면 높은 압축 비율을 얻을 수 있다.

파일 및 디렉토리를 묶는 데 매우 유용하지만, 압축을 위해서는 추가적인 압축 알고리즘을 사용해야 한다. 따라서 다소 복잡할 수 있다. 여기서 다른 압축 알고리즘은 GZIP,BZIP2, XZ, ZSTD 등이 있다.

Unix-like 시스템에서 표준 아카이빙 도구로 사용되며, 소스 코드 배포 등에 널리 사용된다.


그래서 왜 tar.gz을 사용했어!?

GZIP을 TAR과 함께 사용하는 이유는 GZIP이 단일 파일을 압축하는 도구이기 때문이다. 여러 파일이나 디렉토리를 하나의 압축 파일로 묶기 위해서는 TAR 아카이빙 도구가 필요하다.

우선 TAR과 GZIP을 결합하기 위해서는 파일 및 디렉토리를 하나의 아카이프 파일(.tar)로 묶어야한다. 이 과정에서 TAR는 파일 메타데이터를 보존한다.

tar -cvf archive.tar directory/
  • c: 아카이브 생성(create)
  • v: 진행 상황을 출력(verbose)
  • f: 아카이브 파일 이름 지정(file)

그 다음 생성된 아카이브 파일을 GZIP으로 압축하여 .tar.gz 또는 .tgz 확장자를 가진 파일로 만든다.

gzip archive.tar

이 과정을 통해 archive.tar.gz 파일이 생성된다. 두 과정을 하나의 명령어로 결합하게 되면 아래와 같이된다.

tar -czvf archive.tar.gz directory/
  • z: GZIP으로 압축

그래서 어떤 결과를 얻었을까?

  • TAR는 여러 파일과 디렉토리를 하나의 아카이브 파일로 묶을 수 있어, 다중 파일 및 디렉토리 지원할 수 있다.
  • TAR는 파일의 권한, 소유권, 타임스탬프 등의 메타데이터를 보존한다..
  • GZIP은 TAR 아카이브 파일을 효율적으로 압축하여 저장 공간을 절약할 수 있다.
  • 이렇게 TAR와 GZIP의 조합은 파일 시스템의 구조와 메타데이터를 유지하면서 데이터를 효율적으로 압축할 수 있는 강력한 도구가 된다.

추가적으로.. 왜 tar.gz이 zip보다 압축률이 높을까?

TAR는 여러 파일을 하나의 큰 아카이브로 묶고, GZIP은 이 아카이브 파일을 한 번에 압축한다. 이 과정에서 파일 간의 중복 데이터를 더 잘 인식하고 제거할 수 있어, 개별 파일을 압축하는 ZIP보다 더 높은 압축률을 달성할 수 있다.

TAR 아카이브는 파일의 메타데이터를 보존하면서도 추가적인 압축 메타데이터를 최소화한다. 이는 ZIP 파일보다 압축 효율성을 높이는 데 기여한다.

GZIP은 단일 데이터 스트림을 압축하는 데 최적화되어 있어, TAR로 묶인 파일들을 하나의 스트림으로 처리함으로써 더 높은 압축률을 제공할 수 있다.

이러한 특성들로 인해 tar.gz는 일반적으로 zip보다 더 높은 압축률을 제공할 수 있다!

평소에 생각해보지 못한 질문인데, 찾아볼 수 있어서 기분이 좋다!

© Powered by hoonine