블록 상한 511 MiB, 병렬 압축이 거의 공짜인 BZip3
요약
BZip3 는 글과 소스 코드를 무손실로 압축하는 도구로, 블록 상한을 1 MiB 에서 511 MiB 까지 넓히고 전처리에 렘펠 지프 예측을 더했으며, 엔트로피 부호를 문맥 혼합으로 바꾸고 명령줄 도구 여섯 가지를 함께 넣었다.
추천- 이름
- BZip3
- 버전
- 1.5.4
- 요금
- 무료
- 오픈소스
- 오픈소스
- 운영체제
- WindowsmacOSLinux
- 업데이트
- 2026-10-17 16:04
블록 정렬을 쓰는 압축 방식의 구조는 삼십 년 동안 거의 움직이지 않았다. 한 블록은 수백 킬로바이트에서 멈췄고, 한 차례는 하나의 흐름으로만 돌았고, 부호 길이는 바이트 단위에 묶여 있었다. BZip3 는 그 셋을 한꺼번에 열었다. 블록 상한은 511 MiB 까지 올라가고, 처리 흐름은 통째로 바뀌었고, 병렬 처리는 거의 거저 따라온다.
먼저 블록의 경계를 풀다
무손실 압축의 거래는 늘 드러나 있었다. 더 작게 담으려면 대개 시간과 기억 공간을 내놓아야 한다. BZip3 는 글과 소스 코드를 겨냥한 명령줄 압축 도구이며, C 로 쓴 압축 라이브러리가 함께 붙는다. 첫 손잡이는 한 번에 얼마나 멀리 볼 수 있느냐다. 블록 크기는 1 MiB 에서 511 MiB 까지 움직이며 기본은 16 MiB 다. 블록이 클수록 멀리 떨어진 반복을 붙잡을 기회가 늘고 압축률도 따라 오른다. 대가는 공식 문서에 적혀 있다. 압축과 풀기 모두 블록 크기의 약 여섯 배에 해당하는 기억 공간을 쓴다. 게다가 풀기에 필요한 양은 압축하는 그 순간 블록 크기로 굳어지므로, 손잡이를 돌리기 전에 대상 기계가 견디는지 먼저 봐야 한다.
세 단을 쌓아 만든 흐름
흐름은 세 단으로 나뉜다. 입구는 전처리이며 연속 길이 부호와 렘펠 지프 예측이 각각 한 번씩 지나간다. 앞의 것은 이어서 겹치는 바이트를 정리하고, 뒤의 것은 LZ77 방식의 문자열 맞추기로 멀리 있는 같은 조각을 찾은 다음 PPM 방식의 문맥 모형으로 다음 바이트가 가질 값을 어림한다. 이것을 변환 앞에서 끝내 긴 반복을 벗겨 내므로, 재료가 겹칠수록 이득이 크다. 가운데는 블록 정렬 변환이며 접미 배열 구축으로 이루어지고, 비슷한 문맥을 이웃한 자리에 모은다. 덕분에 뒤에 놓인 단순한 낮은 차수의 예측기까지 높은 차수의 통계를 맛본다. 출구는 엔트로피 부호로, 산술 부호에 영차 문맥 혼합을 붙여 문맥마다 여러 확률 추정을 섞는다. 바이트 단위 부호 길이가 만들던 손실은 이렇게 사라진다.

블록 상한은 이 세 단 사이에서 균형을 잡는 지점이다. 같은 자료를 다른 상한으로 돌리면 압축률이 꽤 달라진다. 공식 권고는 기억 공간이 허락하는 상한까지 블록을 올리라는 것이다. 풀기 속도는 블록 크기에 거의 좌우되지 않기 때문이다.
기억 공간과 병렬을 사용자에게 맡긴다
블록끼리는 서로 의존하지 않으므로 병렬은 정말로 거의 거저다. 명령줄은 작업자 수를 하나 받고, 작업자마다 블록 하나를 맡는다. 기본은 하나뿐이고 상한은 64 다. 야간 백업 절차에서 네 개에서 여덟 개를 돌리면 압축 시간이 몇 배로 줄어든다. 온전함에서도 아끼지 않는다. 모든 블록에 CRC32 확인 값이 붙고 풀 때 결과를 바이트 단위로 맞춰 본다. 형식의 고정 부담은 파일마다 9 바이트, 블록마다 9 에서 17 바이트다. 공식은 또 무작위 자료의 부풀림이 보통 0.8 퍼센트 아래에 머문다고 적는다. 압축되지 않는 자료라도 파일이 크게 불어나지는 않는다.
공식 비교에 있는 숫자
개발 측은 비교 목록을 공개했고, 성질이 다른 자료를 통과시켰다. 눈에 띄는 것은 압축 후 크기를 원래 크기로 나눈 비율이다. 함께 들어 있는 소스 묶음은 501,760 바이트에서 72,320 바이트로, 대략 칠분의 일이 된다. 긴 중국어 글은 대략 육분의 일. 소리 자료는 대략 삼분의 일까지만 줄고, 가상 기계의 원판 이미지는 절반에서 멈춘다. 만능이 아니라는 뜻이며, 개발 측은 자리를 분명히 적는다. 글과 소스 코드에 유난히 강하다고.
자료 | 원래 크기 | 압축 후 | 비율 |
|---|---|---|---|
함께 들어 있는 소스 묶음 | 501,760 바이트 | 72,320 바이트 | 14.4% |
긴 중국어 글 | 79,912,971 바이트 | 12,753,530 바이트 | 16.0% |
영어 희곡 전문 | 5,458,199 바이트 | 1,229,840 바이트 | 22.5% |
혼합 자료 Silesia | 211,968,000 바이트 | 47,227,855 바이트 | 22.3% |
혼합 자료 Calgary | 3,265,536 바이트 | 807,959 바이트 | 24.7% |
소리 자료 | 115,742,720 바이트 | 41,187,299 바이트 | 35.6% |
가상 기계 원판 이미지 | 804,192,256 바이트 | 406,343,457 바이트 | 50.5% |

허락, 지원 환경, 함께 오는 명령
허락은 LGPLv3 이고 실행 시점 코드의 저작권은 Kamila Szewczyk 에 있다. 실행 시점 라이브러리에는 Apache 2.0 과 BSD 두 조항 허락의 요소도 함께 들어 있고, 빌드 절차는 GPL 세 조항에 Autoconf 예외를 더한 것을 따른다. 개발 측은 전체를 LGPLv3 단일 허락으로 내놓고 이중 허락은 하지 않는다고 밝힌다. 지원 환경은 생각보다 넓다. x86, x86_64, armv6, armv7, aarch64, ppc64le, mips, mips64, sparc, s390x 열 가지에서 시험했고, 공개 자산에는 Windows 의 32 비트와 64 비트 실행 파일, 여기에 64 비트 Linux 실행 파일이 들어간다. macOS 에서는 꾸러미 관리 도구로 받을 수 있다. 명령줄 선택지는 전통적인 Unix 압축 도구를 닮게 만들었다. 기본 동작은 압축이고, -b 가 블록 크기, -j 가 작업자 수, -d 가 풀기, -t 가 확인만, -B 가 묶음 처리를 맡는다. 소스 묶음에는 딸린 명령 여섯 가지도 들어간다. bunzip3 은 풀기 담당, bz3cat 은 내용을 표준 출력으로 내보내고, bz3grep 은 압축된 묶음 안에서 바로 글을 찾고, bz3less 와 bz3more 와 bz3most 는 푼 결과를 쪽 넘김 도구로 넘긴다. 현재 판 1.5.4 는 2026 년 9 월 7 일에 나왔고, 저장소는 2022 년 5 월부터 계속 갱신되고 있다.
BZip3 는 압축률에서 기적을 일으키려 하지 않는다. 오래 참아 온 몇 가지 제한을 한꺼번에 푼 것이다. 블록은 511 MiB 까지 커지고, 전처리에 예측이 하나 붙고, 엔트로피 부호는 문맥 혼합으로 바뀌고, 병렬은 사용자가 직접 정한다. 어울리는 자리도 분명하다. 소스 코드와 기록과 긴 글처럼 반복이 많고 한 글자도 놓칠 수 없는 것들이다.