단일파일압축 기반 고성능 압축 알고리즘, zstd

단일파일압축 기반 고성능 압축 알고리즘, zstd
Photo by Tim Mossholder / Unsplash

zstd (Zstandard)

  • 페이스북에서 개발한 빠르고 효율적인 압축 알고리즘입니다.
  • 높은 압축률과 빠른 압축 및 해제 속도를 제공합니다.

Motivation

  • zstd는 높은 압축률과 빠른 속도를 모두 제공하기 위해 개발되었습니다. 많은 데이터 처리와 전송이 필요한 환경에서 효율성을 높이기 위함입니다.
    • 스트리밍 지원: zstandard는 스트리밍 압축 및 해제를 지원합니다. 이는 실시간 데이터 처리나 네트워크 전송 시 매우 유용합니다. 단일 파일을 압축하는 방식은 이러한 스트리밍 지원을 더 쉽게 구현할 수 있게 합니다.
    • 단일 파일 압축에 집중함으로써 구현과 사용의 단순성을 유지할 수 있습니다. 이는 개발 및 유지보수 측면에서 장점을 제공합니다.
  • 알고리즘 유형: LZ77 알고리즘을 기반으로 하며, 압축 속도와 해제 속도 모두를 최적화한 방식입니다.

Pros

  • 빠른 속도: 압축과 해제 속도가 매우 빠릅니다.
    • 압축 속도: zstd > gzip
    • 실시간 스트리밍 데이터 압축이 필요한 경우 zstandard가 적합합니다. 예를 들어, 로그 파일을 실시간으로 압축하여 전송하거나 저장할 때 유용합니다.
    • 대용량 로그 파일, 데이터 백업, 데이터베이스 덤프 등의 작업에서 매우 유용합니다.
    • 해제 속도: zstd > gzip
    • 압축률: zstd > gzip
  • 높은 압축률: 데이터 손실 없이 높은 압축률을 제공합니다.
    • 네트워크 대역폭을 절약하거나 저장 공간을 줄여야 할 때 zstandard가 좋은 선택입니다.
  • 효율성: CPU와 메모리 사용이 효율적입니다.

Cons

  • 호환성: 일부 시스템에서는 기본적으로 지원되지 않을 수 있습니다.
  • 복잡성: 다양한 옵션이 있어 설정이 복잡할 수 있습니다.

Alternative

  • lz4: 매우 빠른 압축 및 해제 속도를 제공하는 또 다른 알고리즘입니다.
  • brotli: 구글에서 개발한 압축 알고리즘으로, 웹 전송에 최적화되어 있습니다.

Sample

import zstandard as zstd

# 파일 압축
def compress_file(input_file, output_file):
    with open(input_file, 'rb') as f_in, open(output_file, 'wb') as f_out:
        compressor = zstd.ZstdCompressor()
        f_out.write(compressor.compress(f_in.read()))

# 파일 압축 해제
def decompress_file(input_file, output_file):
    with open(input_file, 'rb') as f_in, open(output_file, 'wb') as f_out:
        decompressor = zstd.ZstdDecompressor()
        f_out.write(decompressor.decompress(f_in.read()))

compress_file('example.txt', 'example.txt.zst')
decompress_file('example.txt.zst', 'example_decompressed.txt')

  • 속도 비교를 위한 코드

import os
import time
import subprocess

# 테스트할 디렉토리 이름
directory_name = "test_directory"

# 압축 및 압축 해제 함수
def measure_time(command):
    start_time = time.time()
    subprocess.run(command, shell=True)
    end_time = time.time()
    return end_time - start_time

# tar.gz 압축 및 압축 해제 시간 측정
tar_gz_compress_command = f"tar -czvf {directory_name}.tar.gz {directory_name}"
tar_gz_decompress_command = f"tar -xzvf {directory_name}.tar.gz"
tar_gz_compress_time = measure_time(tar_gz_compress_command)
tar_gz_decompress_time = measure_time(tar_gz_decompress_command)

# zstd 압축 및 압축 해제 시간 측정
tar_zstd_compress_command = f"tar -I zstd -cvf {directory_name}.tar.zst {directory_name}"
tar_zstd_decompress_command = f"tar -I zstd -xvf {directory_name}.tar.zst"
tar_zstd_compress_time = measure_time(tar_zstd_compress_command)
tar_zstd_decompress_time = measure_time(tar_zstd_decompress_command)

# 결과 출력
print(f"tar.gz 압축 시간: {tar_gz_compress_time:.2f} 초")
print(f"tar.gz 압축 해제 시간: {tar_gz_decompress_time:.2f} 초")
print(f"zstd 압축 시간: {tar_zstd_compress_time:.2f} 초")
print(f"zstd 압축 해제 시간: {tar_zstd_decompress_time:.2f} 초")

Shell

  • 기본 압축
    • 압축된 파일명까지 지정한 경우
zstd example.txt -o example_compressed.zst
  • 압축수준 설정
    • -19가 최대압축, 기본 압축 수준을 -3
zstd -19 example.txt
  • 압축 해제
zstd -d example.txt.zst
  • 디렉토리 압축
    • zstd는 단일 파일만 압축할 수 있습니다. 디렉토리를 압축하려면 tar와 함께 사용해야 합니다.
tar -I zstd -cvf archive.tar.zst directory_name/

  • 디렉토리 압축 해제(tar와 함께 사용)
tar -I zstd -xvf archive.tar.zst
  • 속도 비교를 위한 스크립트
#!/bin/bash

# 테스트할 디렉토리 이름
DIRECTORY_NAME="test_directory"
TAR_GZ_FILE="${DIRECTORY_NAME}.tar.gz"
ZSTD_FILE="${DIRECTORY_NAME}.tar.zst"

# tar.gz 압축 및 압축 해제 시간 측정
echo "Measuring tar.gz compression and decompression time..."

START_TIME=$(date +%s%N)
tar -czvf $TAR_GZ_FILE $DIRECTORY_NAME
END_TIME=$(date +%s%N)
TAR_GZ_COMPRESS_TIME=$(( ($END_TIME - $START_TIME) / 1000000 ))

START_TIME=$(date +%s%N)
tar -xzvf $TAR_GZ_FILE
END_TIME=$(date +%s%N)
TAR_GZ_DECOMPRESS_TIME=$(( ($END_TIME - $START_TIME) / 1000000 ))

# zstd 압축 및 압축 해제 시간 측정
echo "Measuring zstd compression and decompression time..."

START_TIME=$(date +%s%N)
tar -I zstd -cvf $ZSTD_FILE $DIRECTORY_NAME
END_TIME=$(date +%s%N)
TAR_ZSTD_COMPRESS_TIME=$(( ($END_TIME - $START_TIME) / 1000000 ))

START_TIME=$(date +%s%N)
tar -I zstd -xvf $ZSTD_FILE
END_TIME=$(date +%s%N)
TAR_ZSTD_DECOMPRESS_TIME=$(( ($END_TIME - $START_TIME) / 1000000 ))

# 결과 출력
echo "tar.gz 압축 시간: $TAR_GZ_COMPRESS_TIME ms"
echo "tar.gz 압축 해제 시간: $TAR_GZ_DECOMPRESS_TIME ms"
echo "zstd 압축 시간: $TAR_ZSTD_COMPRESS_TIME ms"
echo "zstd 압축 해제 시간: $TAR_ZSTD_DECOMPRESS_TIME ms"

💬 Own Summary

Read more

[책] 생각하는 기계 - ‘황의 분노’와 OIALO, 한 엔지니어의 눈으로 본 리더의 두 얼굴

[책] 생각하는 기계 - ‘황의 분노’와 OIALO, 한 엔지니어의 눈으로 본 리더의 두 얼굴

처음 “생각하는 기계“라는 제목을 보았을 때, 젠슨황을 일컫는 말인 줄알았다. 보통은 유명할지라도 자서전을 읽는 것 자체를 그리 좋아하지는 않는 편이다. 그런데 누군가 이 책에 대해 평하길 “AI의 역사를 지근거리에서 볼 수 있다”라고 한 것을 보았다. 그래서 읽게 되었다. AI의 거대한 흐름을 기술의 관점으로는 지속해서 보고 있지만 구체적으로 왜

By Bongho, Lee
[책]Reshuffle: Who wins when AI restacks the knowledge economy

[책]Reshuffle: Who wins when AI restacks the knowledge economy

원래는 Amazon에 가서 Personal Knowledge Managment에 관한 책을 사려고 했다. Sketch Your Mind라는 책이었는데, 그 때 이 책 “Reshuffle”을 발견하였다. AI가 어떻게 Knowledge Economy를 흔들 것가? 라는 부제를 훑어보면서 저자가 쓴 다른 책을 보게 되었는데 거기에 내가 좋아했던 책을쓴 저자라는 것을 알게 되었다. 그래서 크게 고민하지 않고 구매를 하고

By Bongho, Lee
[책]올라운드투자, 누군가의 투자일기

[책]올라운드투자, 누군가의 투자일기

“올라운드 투자”라는 제목을 보았을 때는, “올라운드 플레이어”가 생각이 났다. “올라운드”라는 표현을 오랜만에 들어본 까닭이었다. 그럼에도 불구하고 이 책을 고른 것은 저자가 그간 보여준 컨텐츠에 대한 신뢰가 있던 까닭이었다. 컨텐츠를 다양하게 보는 편이지만 깊이가 아주 있지는 않았다. 여기서 깊이라 함은 기존 전문적인 정량적 분석의 내용의 수준을 말하는 것이다.

By Bongho, Lee
내가 놓치고 있던 미래, 먼저 온 미래를 읽고

내가 놓치고 있던 미래, 먼저 온 미래를 읽고

장강명 작가의 책은, 유학시절 읽고 처음이었다. 유학시절 "한국이 싫어서"라는 책은 동기부여가 상당히 되는 책이었다. 한국을 떠나 새로운 정채성을 학생으로서 Build up 해나가고 있던 상황에서 이 책은 제목부터 꽤 솔깃하였다. 물론 결말이 기억날 정도로 인상깊은 책은 아니었지만 말이다. 그렇게 시간이 흘러 장강명 작가의 책은 더 이상 읽지 않던

By Bongho, Lee