ZPAQ

ZPAQ
ZPAQ
개발자맷 마호니
안정된 릴리스
7.15[1][2] / 2016년 9월 22일
저장소
기입처C++
운영 체제Microsoft Windows, Linux
플랫폼IA-32, x86-64
유형파일 아카이브 서버
면허증.MIT, 퍼블릭 도메인
웹 사이트mattmahoney.net/dc/zpaq.html Edit this on Wikidata

ZPAQ는 윈도우즈 및 리눅스용 오픈 소스 명령줄 아카이브입니다.저널링 또는 추가 전용 형식을 사용하여 이전 상태로 롤백하여 이전 버전의 파일 및 디렉토리를 검색할 수 있습니다.이전 업데이트 이후 마지막으로 수정된 날짜만 추가하여 빠른 증분 업데이트를 지원합니다.데이터 유형 및 선택한 압축 수준에 따라 중복 제거 및 여러 알고리즘(LZ77, BWT컨텍스트 혼합)을 사용하여 압축합니다.압축 알고리즘이 개선됨에 따라 버전 간의 정방향 및 역방향 호환성을 유지하기 위해 압축 해제 알고리즘을 아카이브에 저장합니다.ZPAQ 소스 코드에는 C++ 응용 프로그램에 압축 및 압축 해제 서비스를 제공하는 퍼블릭 도메인 API libzpaq가 포함됩니다.그 형식은 특허에 의해 방해를 받지 않는 것으로 여겨진다.

아카이브 형식

파일은 ZPAQ 레벨2 저널 [3]형식으로 저장됩니다.표준에서는 스트리밍과 저널링의 두 가지 형식을 정의합니다.저널 형식만 중복 제거, 디렉터리 속성 및 여러 날짜 파일 버전을 지원합니다.

스트리밍 아카이브 형식은 단일 패스로 추출되도록 설계되었습니다.아카이브는 독립적으로 병렬로 압축 해제할 수 있는 일련의 블록으로 분할됩니다.블록은 순차적으로 압축 해제해야 하는 세그먼트로 분할됩니다.각 블록 헤더에는 압축 해제 알고리즘에 대한 설명이 포함되어 있습니다.각 세그먼트(segment)는, 임의의 파일명과 사이즈, 날짜, 속성등의 메타데이터에 대한 옵션의 코멘트, 및 무결성 체크를 위한 원래의 데이터의 옵션의 후행 SHA-1 체크섬을 포함한 헤더를 가진다.파일명이 생략되어 있는 경우는 이전 블록에 있을 가능성이 있는 마지막 이름 있는 파일의 계속으로 간주됩니다.따라서 스트리밍 아카이브에 블록을 삽입, 삭제 또는 정렬하면 블록이 나타내는 데이터에 대해 동일한 작업을 수행할 수 있습니다.

저널 형식은 일련의 트랜잭션 또는 업데이트로 구성됩니다.업데이트는 트랜잭션 헤더 블록, 데이터 블록 시퀀스, 대응하는 프래그먼트테이블 시퀀스 및 인덱스 블록 시퀀스의 4종류의 블록을 포함한다.트랜잭션 헤더 블록은 아카이브 인덱스를 빠르게 읽을 수 있도록 트랜잭션 날짜와 데이터 블록 위를 건너뛰는 포인터를 포함한다.데이터 블록에는 함께 압축된 일련의 파일 조각이 포함됩니다.fragment 테이블은 각 fragment의 크기와 SHA-1 해시를 나타냅니다.인덱스 블록에는 글로벌 아카이브 인덱스에 대한 편집 목록이 포함되어 있습니다.편집은 파일 업데이트 또는 파일 삭제입니다.업데이트는 파일 이름, 마지막으로 수정된 날짜, 속성 및 현재 및 이전 트랜잭션에 대한 프래그먼트 포인터 목록을 포함합니다.fragment는 여러 파일로 공유할 수 있습니다.삭제해도 아카이브에서 데이터가 제거되지 않고 아카이브가 이전 날짜로 롤백되지 않는 한 파일이 추출되지 않음을 나타냅니다.

ZPAQ 표준에는 압축 알고리즘이 지정되어 있지 않습니다.블록 헤더의 압축 해제 알고리즘을 나타내는 형식을 지정합니다.압축 해제 알고리즘은 ZPAQL이라는 언어로 작성되어 바이트 코드로 저장되며 32비트 또는 64비트 x86 코드로 직접 해석 또는 변환하여 실행할 수 있습니다.ZPAQL 프로그램에는 3개의 파트가 있습니다.

  • COMP - 컨텍스트 모델링 컴포넌트의 옵션 체인.
  • HCOMP - COMP 컴포넌트의 콘텍스트를 계산하기 위한 머신 코드.
  • PCOMP - 디코딩된 데이터를 후처리하기 위한 선택적 기계 코드입니다.

COMP 모델은 산술 부호화를 사용하여 한 번에 1비트를 압축하는 PAQ를 기반으로 합니다.컴포넌트에는 9가지 종류가 있습니다.각 컴포넌트는 콘텍스트와 이전 컴포넌트의 예측을 취하여 다음 비트가 1이 될 예측 또는 확률을 출력합니다.마지막 컴포넌트의 출력은 산술적으로 부호화되어 있습니다.컴포넌트 유형은 다음과 같습니다.

  • CONST - 고정 예측입니다.
  • CM - 컨텍스트모델컨텍스트는 테이블에서 예측을 검색하기 위해 사용됩니다.업데이트 시 예측 오류를 줄이기 위해 선택한 항목이 조정됩니다.
  • ICM - 간접 컨텍스트모델컨텍스트는 최근 비트 이력을 나타내는8비트 상태를 검색하기 위해 사용됩니다.이력에서는 CM과 마찬가지로 예측이 선택됩니다.
  • 혼합 - 예측 그룹은 로지스틱 도메인의 가중 평균 또는 로그(p/(1-p))에 의해 결합됩니다.가중치는 컨텍스트에 의해 선택됩니다.업데이트 시 가중치는 보다 정확한 입력에 유리하도록 조정됩니다.
  • MIX2 - 가중치가 1에 추가되도록 제한된 2 입력 MIX.
  • AVG - 고정 무게의 MIX2.
  • SSE - 보조 기호 추정기.주어진 컨텍스트와 다른 구성요소의 양자화된 예측을 보간된 표에서 예측을 검색합니다.
  • ISSE - 간접 보조 기호 추정기.컨텍스트는 ICM과 마찬가지로 비트이력을 선택하고 다음으로 비트이력은 입력과 상수1을 혼합하는 가중치 쌍을 선택합니다.
  • MATCH - 이전에 발생한 컨텍스트를 검색하고 일치 길이에 따라 강도를 사용하여 다음 비트를 예측합니다.

HCOMP 섹션은 COMP 섹션의 컴포넌트 컨텍스트를 계산합니다.상태는 4개의 32비트 레지스터(A, B, C, D), 16비트 프로그램 카운터, 조건 플래그 비트 및 2개의 메모리 어레이(바이트(M) 중 하나와 32비트 워드(H) 중 하나)입니다.H의 선두는 콘텍스트의 배열을 형성합니다.어셈블리 언어 유사 프로그램은 A에서 입력된 바이트를 사용하여 코드화되거나 디코딩된 바이트별로 한 번 호출됩니다.COMP 섹션에서 볼 수 있는 마지막 컨텍스트는 이전에 본 현재 바이트의 비트와 결합된 계산 컨텍스트입니다.

옵션인 PCOMP 섹션은 디코딩된 데이터를 후처리하는 데 사용됩니다.PCOMP 섹션은 HCOMP 섹션과 같이 별도의 가상 시스템에서 실행됩니다. 단, 압축 및 압축 해제에 모두 사용되는 COMP 섹션과 달리 PCOMP 섹션은 압축 해제 중에만 실행됩니다.컴프레서는 코딩 전에 입력 데이터에 대해 역연산을 수행합니다.

ZPAQL의 예시

ZPAQL 소스 코드에서는 대부분의 경우 공백으로 구분된 각 단어가 1바이트로 조립되고 괄호 안에 주석이 있는 텍스트 구문을 사용합니다.다음으로 레벨 5 압축과 유사한 중간 설정 예를 나타냅니다.순서 0 ~ 5의 해시 콘텍스트를 사용하는 컴포넌트의 ICM-ISE 체인, 순서7 콘텍스트를 사용하는 MATCH 및 MIX를 사용한 이들 비트 예측의 평균화에 대해 설명합니다.후처리는 없습니다.

comp 3 3 0 0 8 (hh hm ph pm n)    0 icm 5      (order 0...5 chain)    1 isse 13 0    2 isse 17 1    3 isse 18 2    4 isse 18 3    5 isse 19 4    6 match 22 24  (order 7)    7 mix 16 0 7 24 255  (order 1)  hcomp    c++ *c=a b=c a=0 (save in rotating buffer M)    d= 1 hash *d=a   (orders 1...5 for isse)    b-- d++ hash *d=a    b-- d++ hash *d=a    b-- d++ hash *d=a    b-- d++ hash *d=a    b-- d++ hash b-- hash *d=a (order 7 for match)    d++ a=*c a<<= 8 *d=a       (order 1 for mix)    halt  end 

COMP 파라미터는 HCOMP 섹션에 각각8 바이트로, PCOMP 섹션에서 사용되지 않는 워드와 바이트 배열의 로그 베이스2 사이즈(hh, hm)를 나타냅니다.n = 8개의 번호가 매겨진 구성요소가 있습니다.구성 요소는 테이블 크기와 입력을 설명하는 매개 변수를 사용합니다.특히 각 ISSE는 이전 컴포넌트에서 입력을 받고 MIX는 0부터7개의 컴포넌트에서 입력을 받습니다.행 "5 ise 19 4"는 ISSE가 2비트 이력의19+6 테이블사이즈를 가지며 컴포넌트4로부터의 입력을 받고 있음을 나타냅니다.

HCOMP부에서는 B, C 포인트를 8바이트 회전 어레이 M에 등록하고, 8워드 어레이 H.M에 대한 D 포인트를 사용하여 A 레지스터로부터의 입력의 마지막 8바이트를 기억한다.C는 이 버퍼의 헤드를 가리킵니다.해시 명령은 다음을 계산합니다.

A=(+*b+512)*98년 773.

H[0]그러므로 코드 매장 다양한 주문의 컨텍스트 해시도...H[7].

Deduplication

업데이트에, ZPAQ 조각으로 그들의SHA-1 해시를 계산하고, 해시는 기록 보관소에 저장된 그들 비교되는 입력 파일을 나눕니다.만약 일치하는 내용이 있다면, 그 조각들이 동일한 것으롰고, 이전에 압축되어 조각에 1포인터 저장된 것으로 가정한다.그렇지 않으면 그 조각은 블록 압축될 것으로 압축되어 있다.차단 크기 64MiB에 압축 수준에 따라 최대 16MiB 수 있다.

파일 조각으로 나누어지content-dependent 경계에는 분열되어 있다.약간 라빈 지문보다, ZPAQ는 주문 1컨텍스트, 그 사이의 어떤 예측한 바이트에 의해 예측할 수 없는 마지막 32바이트에 달려 있는 해시를 사용한다.만약 32비트 hash의 선도하는 16비트 모두 0을 풀어 조각 경계 표시됩니다.이 64KiB의 평균 조각 크기를 준다.

완만하해시 256바이트 표에서는 바이트 마지막으로 각각 가능한order-1 맥락에서 봐포함하는을 사용한다.해시고 바이트 예고된 것도 이상한 상수로, 또한 multiplying한 것 다음 바이트를 추가하거나 4의 배수가 바이트 예측하지 못한 심지어 숫자에 의해 업데이트됩니다.

압축

ZPAQ에는 가장 빠른 것부터 최상의 것까지 5가지 압축 레벨이 있습니다.최상의 수준을 제외하고 중복 제거에 사용되는 순서 1 예측 테이블의 통계를 사용하여 입력이 랜덤으로 표시되는지 여부를 테스트합니다.이 경우 압축하지 않고 속도 최적화로 저장된다.

ZPAQ는 E8E9 변환을 사용하여 일반적으로 .exe 및 .dll 파일에 있는 x86 코드의 압축을 개선합니다.E8E9 트랜스폼은 CALL 명령과 JMP 명령(opcode E8 및 E9 16진수)을 스캔하여 상대 주소를 절대 주소로 바꿉니다.그런 다음 코드를 PCOMP 섹션에 삽입하여 역변환을 수행합니다.

에러 리커버리

ZPAQ에는 오류 수정 기능이 없지만 아카이브가 손상된 경우 손상을 제한하는 몇 가지 기능이 있습니다.압축 해제 시 모든 SHA-1 해시가 체크됩니다.해시가 일치하지 않거나 다른 오류가 발생하면 경고가 인쇄되고 블록이 무시됩니다.블록은 무작위로 선택되었지만 다음 블록의 시작을 스캔으로 찾을 수 있도록 고정된 문자열을 포함하는 13바이트의 "로케이터 태그"로 시작합니다.데이터 fragment가 손실되면 해당 fragment를 참조하는 모든 파일과 블록 내의 나머지 fragment도 손실됩니다.fragment 테이블이 손실된 경우 대응하는 데이터 블록에 저장되어 있는 fragment사이즈의 용장 리스트에서 해시를 재계산하여 회복할 수 있습니다.이 경우 데이터 블록 전체의 두 번째 해시가 체크됩니다.인덱스 블록이 손실되면 해당 파일이 손실됩니다.인덱스 블록은 파손을 제한하기 위해 소형(16KiB)입니다.

업데이트는 임시 트랜잭션 헤더를 추가한 후 마지막 단계로 헤더를 업데이트함으로써 트랜잭션됩니다.업데이트가 중단되면 임시 헤더는 ZPAQ에 유용한 데이터를 찾을 수 없음을 알립니다.다음 업데이트에서는 이 초과 데이터를 덮어씁니다.

기본 사용법

보관 작성 및 보관 업데이트

zpaq add directory/archive.zpaq directory/source_directory -mX -key password

옵션-mX(X는 0 ~5의 압축 수준) 및-key(AES-256 암호화를 실행한다)는 생략할 수 있습니다.0 압축 수준에서는 데이터가 압축되지 않지만 데이터 중복 제거가 수행됩니다.압축 수준 4와 5는 시간이 많이 걸릴 수 있습니다.디폴트 (1)에서는 단순한 LZ77 압축이 사용됩니다.

아카이브 내용 목록 표시

zpaq list archive.zpaq에, 최신 버전의 파일과 디렉토리를 나타냅니다.추가 중-all모든 파일 및 디렉토리의 모든 버전이 다음 형식으로 나열됩니다.version_number/directory/file_name출력은 GREP 및 기타 도구로 더 처리할 수 있습니다.

파일 추출 중

zpaq extract archive.zpaqActive Directory에 있는 전체 아카이브의 마지막 버전의 패키지가 해제됩니다. zpaq extract backup.zpaq path는 지정된 디렉토리(또는 파일)만 추출합니다.의 추가-until N옵션은 음수가 허용되는 버전을 선택합니다. -2는 아카이브의 세 번째 최신 버전을 추출합니다.옵션-to는 추출된 파일을 저장할 위치를 ZPAQ에 나타냅니다.

zpaq extract backup.zpaq -all -only "*muppet*"는 이름에 "muppet"이 포함된 모든 파일 및 디렉토리의 모든 버전을 추출합니다.다른 파일 버전이 다른 디렉토리에 배치됩니다(0001/ 0002/ 0003/등) -only는 옵션입니다.

역사

  • 2009년 2월 15일 - zpaq 0.01 시험 출시.
  • 2009년 3월 12일 - zpaq 1.00 규격이 확정되어 하위 호환성이 보장됩니다.
  • 2009년 9월 29일 - zpaq 1.06, v1.01로 업데이트된 사양에 자체 추출 아카이브를 지원하는 로케이터 태그를 추가합니다.
  • 2009년 10월 14일 - zpaq 1.09는 속도 최적화로 ZPAQL을 C++ 번역기에 추가하였습니다.
  • 2010년 9월 27일 - 별도의 libzpaq 0.01 API.
  • 2011년 1월 21일 - pzpaq 0.01, 최초의 멀티 스레드 버전, 나중에 zpaq에 다시 통합되었습니다.
  • 2011년 11월 13일 - zpaq 4.00, J 추가IT 컴파일러(ZPAQL에서x86)를 사용하면 최적화를 위해 외부 C++ 컴파일러가 필요 없습니다.
  • 2012년 2월 1일 - zpaq 5.00, 사양이 v2.00으로 업데이트되어 빈 COMP 섹션(후 처리만 가능).
  • 2012년 9월 28일 - zpaq 6.00, 사양이 v2.01로 업데이트되어 저널링 형식이 추가되었습니다.
  • 2013년 1월 23일 - zpaq 6.19는 개발 기능을 별도의 프로그램인 zpaqd로 분할합니다.

관련 프로젝트

  • 스쿼시, 다수의 코덱을 지원하는 압축 추상화 레이어.
  • ZPAQ 스트리밍 포맷 추출을 포함한 150개 이상의 포맷을 지원하는 아카이브 서버인 PeaZip.
  • fastqz는 libzpaq를 [4]사용하여 구축된 FASTQ 압축기입니다.
  • zpaqfranz, 심각한 백업 및 재해 복구 관리자를 위한 스위스 군용 나이프입니다.
  • wcx_zpaq, Total [5]Commander용 패커 플러그인(wcx).

레퍼런스

  1. ^ https://api.github.com/repos/zpaq/zpaq/releases; 검색: 2017년 1월 9일.
  2. ^ "Release 7.15". 22 September 2016. Retrieved 15 March 2018.
  3. ^ Mahoney, M. [1] 고압축 데이터를 위한 ZPAQ 개방형 표준 - 레벨 2, 2013년 6월 3일
  4. ^ Bonfield JK, Mahoney MV(2013) FASTQSAM 포맷 시퀀싱 데이터 압축.PLoS ONE 8(3): e59190.doi:10.1371/journal.pone.0059190
  5. ^ "[WCX] ZPAQ". Total Commander Forums. Retrieved 10 July 2021.

외부 링크