Zeekstd: ZSTD Seekable Format의 Rust 구현
요약
Zeekstd는 Zstandard Seekable Format을 Rust 언어로 구현한 라이브러리입니다. 이 형식은 압축된 데이터를 독립적인 프레임으로 분할하여, 파일 중간 섹션 디압축 시 전체 해제 없이 효율적으로 데이터에 접근할 수 있게 합니다. 또한 seek table을 명시하여 요청된 데이터로 빠르게 이동하는 기능을 제공합니다.
핵심 포인트
- Zstandard Seekable Format의 Rust 구현체입니다.
- 데이터를 독립적인 프레임으로 분할하여 디압축 효율성을 높였습니다.
- seek table을 통해 원하는 섹션으로 빠르게 접근(seeking) 가능합니다.
- 기존 zstd 형식과 완벽하게 호환되도록 설계되었습니다.
Zeekstd
Zstandard Seekable Format의 Rust 구현체입니다.
개요 (About)
seekable format은 압축된 데이터를 일련의 독립적인 프레임으로 분할하며, 각 프레임은 개별적으로 압축됩니다. 따라서 압축 파일 중간 섹션을 디압축하는 경우, 전체 파일을 해제하는 대신 zstd가 최대 한 프레임 분량의 추가 데이터만 디압축하면 됩니다.
이 형식은 또한 seekable decoder가 요청된 데이터로 효율적으로 이동할 수 있도록 하는 seek table을 명시합니다. 이 seek table은 Zstandard Skippable Frame에 배치될 수 있으며, seekable 압축 파일 끝에 추가되거나 독립적인 파일로 작성될 수 있습니다.
모든 규격 준수 zstd decoder는 seekable compressed file을 디압축하여 원래 콘텐츠를 복원할 수 있습니다. seek table이 skippable frame에 배치되어 있기 때문에, 이 형식에 대해 알지 못하는 decoder들은 이를 단순히 무시합니다.
Zeekstd는 specification의 업데이트된 버전을 구현함으로써 seekable format에 추가 기능을 제공하지만, 이는 seekable format의 초기 버전과 완벽하게 호환됩니다.
CLI
The cli 디렉터리는 zeekstd 라이브러리의 모든 기능을 구현하는 CLI 도구를 제공합니다.
벤치마크 (Benchmarks)
AMD Ryzen 7 8845HS를 탑재한 제 노트북과 Performance CPU Governor에서 실행했습니다. 참고로, 이 벤치마크에는 zstd 크레이트의 스트리밍 인메모리 Encoder/Decoder도 포함되어 있습니다.
cargo bench를 사용하여 직접 벤치마크를 실행해 보세요.
압축 (Compression)
Silesia compression corpus에서 수집된 Charles Dickens의 작품을 압축했습니다. zeekstd 인코더는 무압축 데이터가 2 MiB에 도달하면 새 프레임을 생성하고, 압축 과정 동안 시크 테이블(seek table)을 채웁니다.
모든 인코더는 압축 레벨 1을 사용합니다.
| Compressor | Throughput |
|---|---|
zeekstd::RawEncoder | 376.36 MiB/s |
| ... |
압축 해제 (Decompression)
모든 디코더는 Silesia compression corpus에서 수집된 Charles Dickens의 작품 중 시크 가능한 ZSTD 압축 파일(6개 프레임, 1개 건너뛰기 가능 프레임)을 압축 해제합니다.
| Decompressor | Throughput |
|---|---|
zeekstd::Decoder | 1.4335 GiB/s |
zstd::stream::raw::Decoder | 1.4641 GiB/s |
압축 (Compression)
시크 가능한 Encoder는 무압축 데이터가 2MiB에 도달하면 자동으로 새 프레임을 시작합니다. 이와 다른 압축 매개변수들은 EncodeOptions를 참조하여 변경할 수 있습니다.
use std::{fs::File, io};
use zeekstd::Encoder;
...
압축 해제 (Decompression)
기본적으로 시크 가능한 Decoder는 첫 번째 프레임부터 마지막 프레임까지 모든 것을 압축 해제하지만, 특정 데이터만 압축 해제하도록 설정할 수도 있습니다.
use std::{fs::File, io};
use zeekstd::Decoder;
...
적절한 프레임 크기 찾기 (Finding the Right Frame Size)
프레임마다 압축 데이터에 소량의 메타데이터가 추가되고 시크 테이블(seek table)의 크기가 증가합니다. 시크 테이블의 각 항목은 항상 같은 크기를 가지지만, 메타데이터의 크기는 프레임 체크섬 사용 여부와 같은 압축 매개변수에 따라 달라집니다. 작은 프레임 크기는 압축률에 부정적인 영향을 미치지만, 데이터의 작은 세그먼트를 요청할 때 디압축 비용을 줄여주므로 균형점을 찾아야 합니다.
일반적으로 몇 KiB보다 작은 아주 작은 프레임 크기는 눈에 띄게 압축률을 저하시키므로 피해야 합니다.
퍼징(Fuzzing)
nix develop .#fuzz를 실행하여 nightly 컴파일러와 cargo-fuzz가 설치된 셸로 진입합니다. 이후, <target>이 fuzz/Cargo.toml에 있는 bin의 이름인 경우, cargo fuzz run <target>으로 퍼징 타겟을 실행합니다.
대안적으로, Nix를 사용하지 않는 경우 cargo-fuzz와 nightly 컴파일러를 수동으로 설치할 수 있습니다.
cargo install cargo-fuzz
rustup default nightly
라이선스(License)
- zstd C 라이브러리는 Dual BSD/GPLv2 라이선스를 따릅니다.
- Zeekstd는 BSD 2-Clause License를 따릅니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN OpenAI Codex의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기