Zstandard 또는 짧은 버전인 zstd
빠른 무손실 압축 알고리즘으로, zlib 수준 및 더 나은 압축 비율의 실시간 압축 시나리오를 목표로 합니다. Huff0 및 FSE 라이브러리에서 제공하는 매우 빠른 엔트로피 단계가 지원됩니다.
Zstandard의 형식은 안정적이며 RFC8878에 문서화되어 있습니다. 여러 개의 독립적인 구현이 이미 사용 가능합니다. 이 저장소는 오픈 소스 이중 BSD 또는 GPLv2 라이선스 C 라이브러리로 제공되는 참조 구현과 .zst
, .gz
, .xz
및 .lz4
파일을 생성 및 디코딩하는 명령줄 유틸리티를 나타냅니다. 프로젝트에 다른 프로그래밍 언어가 필요한 경우 알려진 포트 및 바인딩 목록이 Zstandard 홈페이지에 제공됩니다.
개발 지점 상태:
참고로 Core i7-9700K CPU @ 4.9GHz를 탑재하고 Ubuntu 20.04( Linux ubu20 5.15.0-101-generic
)를 실행하는 데스크탑에서 오픈 소스 인메모리인 lzbench를 사용하여 여러 가지 빠른 압축 알고리즘을 테스트하고 비교했습니다. Silesia 압축 코퍼스에서 gcc 9.4.0으로 컴파일된 @inikep의 벤치마크입니다.
압축기 이름 | 비율 | 압축 | 압축을 푼다. |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510MB/초 | 1580MB/초 |
zlib 1.2.11 -1 | 2.743 | 95MB/초 | 400MB/초 |
브로틀리 1.0.9 -0 | 2.702 | 395MB/초 | 430MB/초 |
zstd 1.5.6 --fast=1 | 2.437 | 545MB/초 | 1890MB/초 |
zstd 1.5.6 --fast=3 | 2.239 | 650MB/초 | 2000MB/초 |
퀵lz 1.5.0 -1 | 2.238 | 525MB/초 | 750MB/초 |
lzo1x 2.10 -1 | 2.106 | 650MB/초 | 825MB/초 |
lz4 1.9.4 | 2.101 | 700MB/초 | 4000MB/초 |
lzf 3.6 -1 | 2.077 | 420MB/초 | 830MB/초 |
빠른 1.1.9 | 2.073 | 530MB/초 | 1660MB/초 |
--fast=#
으로 지정된 음수 압축 수준은 압축 비율을 희생하면서 더 빠른 압축 및 압축 해제 속도를 제공합니다.
Zstd는 압축 속도를 희생하면서 더 강력한 압축 비율을 제공할 수도 있습니다. 속도와 압축의 균형은 작은 단위로 구성 가능합니다. 압축 해제 속도는 zlib 또는 lzma와 같은 대부분의 LZ 압축 알고리즘이 공유하는 속성인 모든 설정에서 유지되고 거의 동일하게 유지됩니다.
다음 테스트는 gcc로 컴파일된 @inikep의 오픈 소스 인 메모리 벤치마크인 lzbench를 사용하여 Core i7-6700K CPU @ 4.0GHz를 갖춘 Linux Debian( Linux version 4.14.0-3-amd64
)을 실행하는 서버에서 실행되었습니다. 7.3.0, 실레지아 압축 코퍼스.
압축 속도 대 비율 | 감압 속도 |
---|---|
몇 가지 다른 알고리즘은 느린 속도에서 더 높은 압축 비율을 생성하여 그래프를 벗어날 수 있습니다. 느린 모드를 포함한 더 큰 사진을 보려면 이 링크를 클릭하세요.
이전 차트는 일반적인 파일 및 스트림 시나리오(수 MB)에 적용 가능한 결과를 제공합니다. 작은 데이터에는 다양한 관점이 있습니다.
압축할 데이터의 양이 적을수록 압축하기가 더 어려워집니다. 이 문제는 모든 압축 알고리즘에 공통적으로 나타나는데, 그 이유는 압축 알고리즘이 과거 데이터로부터 미래 데이터를 압축하는 방법을 학습하기 때문입니다. 그러나 새로운 데이터 세트가 시작될 때 기초로 삼을 "과거"는 없습니다.
이러한 상황을 해결하기 위해 Zstd는 선택한 데이터 유형에 대한 알고리즘을 조정하는 데 사용할 수 있는 훈련 모드를 제공합니다. 훈련 Zstandard는 몇 가지 샘플(샘플당 하나의 파일)을 제공하여 달성됩니다. 이 훈련의 결과는 "dictionary"라는 파일에 저장되며 압축 및 압축 해제 전에 로드되어야 합니다. 이 사전을 사용하면 작은 데이터에 대해 달성할 수 있는 압축률이 크게 향상됩니다.
다음 예에서는 github 공개 API에서 생성된 github-users
샘플 세트를 사용합니다. 이는 각각 약 1KB의 대략 10K 레코드로 구성됩니다.
압축비 | 압축 속도 | 감압 속도 |
---|---|---|
이러한 압축 이득은 더 빠른 압축 및 압축 해제 속도를 동시에 제공하는 동시에 달성됩니다.
작은 데이터 샘플군에 어느 정도 상관관계가 있는 경우 훈련이 작동합니다. 사전이 데이터에 더 구체적일수록 더 효율적입니다( 범용 사전은 없습니다). 따라서 데이터 유형별로 하나의 사전을 배포하는 것이 가장 큰 이점을 제공합니다. 사전 이득은 처음 몇 KB에서 대부분 효과적입니다. 그런 다음 압축 알고리즘은 이전에 디코딩된 콘텐츠를 점진적으로 사용하여 파일의 나머지 부분을 더 효과적으로 압축합니다.
사전 만들기
zstd --train FullPathToTrainingSet/* -o dictionaryName
사전으로 압축
zstd -D dictionaryName FILE
사전으로 압축해제
zstd -D dictionaryName --decompress FILE.zst
make
이 프로젝트의 공식적으로 유지 관리되는 빌드 시스템입니다. 다른 모든 빌드 시스템은 "호환"되고 타사에서 유지 관리되며 고급 옵션에 약간의 차이가 있을 수 있습니다. 시스템에서 허용하는 경우 make
사용하여 zstd
및 libzstd
빌드하는 것이 좋습니다.
시스템이 표준 make
(또는 gmake
)와 호환되는 경우 루트 디렉터리에서 make
호출하면 루트 디렉터리에 zstd
cli가 생성됩니다. 또한 lib/
에 libzstd
생성합니다.
사용 가능한 기타 옵션은 다음과 같습니다.
make install
: zstd cli, 라이브러리 및 매뉴얼 페이지 생성 및 설치make check
: zstd
생성 및 실행, 로컬 플랫폼에서 동작 테스트 Makefile
GNU 표준 Makefile 규칙을 따르며 단계적 설치, 표준 플래그, 디렉터리 변수 및 명령 변수를 허용합니다.
고급 사용 사례의 경우 바이너리 생성을 제어하는 특수 컴파일 플래그가 libzstd
라이브러리의 경우 lib/README.md
에, zstd
CLI의 경우 programs/README.md
에 문서화되어 있습니다.
cmake
프로젝트 생성기는 build/cmake
내에 제공됩니다. Makefile 또는 기타 빌드 스크립트를 생성하여 zstd
바이너리, libzstd
동적 및 정적 라이브러리를 생성할 수 있습니다.
기본적으로 CMAKE_BUILD_TYPE
Release
로 설정됩니다.
zstd
CMake의 Universal2 지원을 사용하여 Apple Silicon(M1/M2)과 Intel을 모두 지원하여 구축하고 설치할 수 있습니다. Fat/Universal2 빌드 및 설치를 수행하려면 다음 명령을 사용하십시오.
cmake -B build-cmake-debug -S build/cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES= " x86_64;x86_64h;arm64 "
cd build-cmake-debug
ninja
sudo ninja install
Meson 프로젝트는 build/meson
내에 제공됩니다. 해당 디렉터리의 빌드 지침을 따르세요.
Meson을 사용하여 이 프로젝트를 빌드하는 방법에 대한 예를 보려면 .travis.yml
파일을 살펴보세요.
기본 빌드 유형은 release 입니다.
zstd vcpkg 종속성 관리자를 빌드하고 설치할 수 있습니다.
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
vcpkg의 zstd 포트는 Microsoft 팀 구성원과 커뮤니티 참가자에 의해 최신 상태로 유지됩니다. 버전이 오래된 경우 vcpkg 저장소에서 이슈 또는 풀 요청을 생성하세요.
zstd용으로 사전 빌드된 바이너리를 설치하거나 Conan을 사용하여 소스에서 빌드할 수 있습니다. 다음 명령을 사용하십시오.
conan install --requires= " zstd/[*] " --build=missing
zstd Conan 레시피는 Conan 관리자와 커뮤니티 기여자가 최신 상태로 유지합니다. 버전이 오래된 경우 ConanCenterIndex 저장소에서 이슈나 풀 요청을 생성하세요.
build
디렉터리로 이동하면 다음과 같은 추가 가능성을 찾을 수 있습니다.
build/VS_scripts
에서 Visual Studio 솔루션을 열 필요 없이 zstd
cli 및 libzstd
라이브러리를 빌드하는 Visual 컴파일러용 자동 빌드 스크립트입니다. 리포지토리 루트에서 buck build programs:zstd
실행하여 Buck을 통해 zstd 바이너리를 빌드할 수 있습니다. 출력 바이너리는 buck-out/gen/programs/
에 있습니다.
Bazel 중앙 저장소에 호스팅된 모듈을 사용하여 zstd를 Bazel 프로젝트에 쉽게 통합할 수 있습니다.
make check
실행하여 빠른 로컬 연기 테스트를 실행할 수 있습니다. make
사용할 수 없는 경우 src/tests
디렉터리에서 playTest.sh
스크립트를 실행하세요. 테스트 스크립트가 zstd
및 datagen
바이너리를 찾으려면 두 개의 환경 변수 $ZSTD_BIN
및 $DATAGEN_BIN
이 필요합니다. CI 테스트에 대한 자세한 내용은 TESTING.md
를 참조하세요.
Zstandard는 현재 Facebook 및 기타 여러 대규모 클라우드 인프라 내에 배포되어 있습니다. 다양한 형식과 사용 사례로 대량의 데이터를 압축하기 위해 지속적으로 실행됩니다. Zstandard는 프로덕션 환경에 안전한 것으로 간주됩니다.
Zstandard는 BSD 또는 GPLv2에 따라 이중 라이센스를 받았습니다.
dev
브랜치는 release
에 도달하기 전에 모든 기여가 병합되는 브랜치입니다. 패치를 제안할 계획이라면 dev
브랜치나 자체 기능 브랜치에 커밋하세요. release
에 대한 직접 커밋은 허용되지 않습니다. 자세한 내용은 CONTRIBUTING을 읽어보세요.