전체 아카이브를 압축 해제하지 말고 한 파일만 얻기 — ARCX 소개
Source: Dev.to
개요
대부분의 아카이브 형식은 간단한 작업을 불필요하게 비싸게 만듭니다: 파일 하나가 필요해서 전체를 다운로드하고 압축을 풀어야 합니다.
저는 이를 해결하기 위해 ARCX라는 압축 아카이브 형식을 만들었습니다.
ARCX는 tar+zstd와 같은 교차 파일 압축과 ZIP과 같은 인덱스 기반 랜덤 접근을 결합하여, 큰 아카이브에서 단일 파일을 나머지를 압축 해제하지 않고도 밀리초 안에 가져올 수 있습니다.
GitHub:
설치
cargo install arcx
벤치마크 (5개의 실제 데이터셋)
| 데이터셋 | ARCX 읽은 바이트 | TAR+ZSTD 읽은 바이트 | 감소율 |
|---|---|---|---|
| Python ML | 326 KB | 63.1 MB | 198× 적음 |
| Build Artifacts | 714 KB | 140.4 MB | 202× 적음 |
| 다른 3개 데이터셋 | ≈ 200 ms 파일당 ~200 MB 아카이브에서 조회 | — | tar+zstd 대비 최대 200× 적은 데이터 읽음 |
| 압축 오버헤드 | tar+zstd 대비 약 3 % | — | — |
사용 사례
- CI/CD 파이프라인 (아티팩트 조회)
- 부분 읽기가 가능한 클라우드 스토리지
- 대규모 코드베이스
- 패키지 레지스트리
현대 시스템은 전체 아카이브가 아니라 즉시 필요한 하나의 파일을 요구하는 경우가 많습니다.
ARCX 작동 방식
- 블록 기반 압축 – 아카이브를 독립적으로 압축된 블록들로 나눕니다.
- 이진 매니페스트 인덱스 – 아카이브 끝에 저장되어 각 파일을 블록 오프셋에 매핑합니다.
- 직접 오프셋 읽기 – 클라이언트는 다음을 수행할 수 있습니다:
- 인덱스에서 파일을 조회한다.
- 해당 블록으로 이동한다.
- 그 블록만 압축 해제한다.
이렇게 하면 전체 아카이브를 스캔하거나 압축을 푸는 대신 간단한 매니페스트 조회와 단일 블록 읽기로 대체됩니다.
포맷 비교
| 포맷 | 압축 강도 | 접근 속도 |
|---|---|---|
| ZIP | 약함 | 빠름 |
| tar+zstd | 강함 | 느림 |
| ARCX | 강함 | 빠름 |
제한 사항 및 향후 작업
- ARCX는 스트리밍을 위해 설계되지 않음 (
tar와 같이). 매니페스트가 끝에 기록되므로 읽기 전에 아카이브가 완전해야 합니다. - 원격/S3 범위 읽기 워크플로는 아직 완전하게 벤치마크되지 않았습니다.
- 메타데이터/인덱스 오버헤드는 매우 많은 파일 수에 대해 아직 최적화 중입니다.
- Rust 기반 전체 추출 벤치마크는 진행 중입니다.
아직 초기 단계 – 피드백을 환영합니다.