스냅(압축)

Snappy (compression)
재빠르다
원저작자제프 딘, 산제이 게마왓, 스타이너 H. 건더슨
개발자구글
초기 릴리즈2011년 3월 18일(2011-03-18)
안정된 릴리스
1.1.9 / 2021년 5월 5일, 14개월 전(2021-05-05)[1]
저장소
기입처C++
운영 체제크로스 플랫폼
플랫폼휴대용
크기2 MB
유형data 압축
면허증.Apache 2 (최대 1.0.1) / 새로운 BSD
웹 사이트google.github.io/snappy/

스내피(이전의 Zippy)는 구글이 LZ77의 아이디어를 기반으로 C++로 작성한 고속 데이터 압축압축 해제 라이브러리이며 [2][3]2011년에 오픈 소스되었습니다.최대 압축이나 다른 압축 라이브러리와의 호환성을 목표로 하는 것이 아니라 매우 빠른 속도와 합리적인 압축을 목표로 합니다.압축 속도는 250MB/s, 압축 해제 속도는 500MB/s입니다.64비트 모드로 동작하는 2011년식 2.26GHz Core i7 프로세서의 싱글 코어를 사용합니다.압축비[4]gzip보다 20~100% 낮습니다.

스내피는 Bigtable, MapReduce같은 구글 프로젝트와 구글 내부 RPC 시스템의 데이터 압축에 널리 사용되고 있습니다.MariaDB ColumnStore,[5] Cassandra, Couchbase, Hadoop, LevelDB, MongoDB, RocksDB,[6] Lucene, SparkInfluenceDB와 같은 오픈 소스 프로젝트에서 사용할 수 있습니다.압축 해제 테스트는 압축된 스트림의 오류를 감지하기 위해 수행됩니다.스내피는 인라인어셈블러를 사용하지 않으며(일부[7] 최적화 제외) 이식 가능합니다.

스트림 포맷

스냅 부호화는 비트 지향적인 것이 아니라 바이트 지향적인 것입니다(스트림에서 송신 또는 소비되는 것은 전체 바이트뿐입니다.형식은 Huffman 트리나 산술 인코더와 같은 엔트로피 인코더를 사용하지 않습니다.

스트림의 첫 번째 바이트는 little-endian varint[8]저장되는 압축되지 않은 데이터의 길이이며 가변 길이 인코딩이 가능합니다.각 바이트의 하위 7비트가 데이터에 사용되며, 상위 비트는 길이 필드의 끝을 나타내는 플래그입니다.

스트림의 나머지 바이트는 4가지 요소 유형 중 하나를 사용하여 인코딩됩니다.요소 유형은 요소의 [9]첫 번째 바이트(태그 바이트)의 하위 2비트로 인코딩됩니다.

  • 00 – 리터럴 – 압축되지 않은 데이터. 상위 6비트는 데이터의 길이(len-1)를 저장하는 데 사용됩니다.60보다 큰 길이는 60(1바이트)~63(4바이트)의 6비트 길이로 나타나는 1~4바이트 정수로 저장됩니다.
  • 01 – 길이가 3비트로 저장되고 오프셋이 11비트로 저장되는 복사. 오프셋의 일부로 태그 바이트 후 1바이트가 사용됩니다.
  • 10 – 길이가 태그 바이트의 6비트로 저장되고 오프셋이 태그 바이트 뒤에 2바이트 정수로 저장되는 복사;
  • 11 – 길이가 태그 바이트의 6비트로 저장되고 오프셋이 태그 바이트 뒤에 4바이트 리틀 엔디언 정수로 저장되는 복사;

복사는 사전을 참조합니다(방금 압축 해제된 데이터).오프셋은 현재 위치에서 이미 압축 해제된 스트림으로 다시 이동하는 것입니다.길이는 사전에서 복사할 바이트 수입니다.1.0 Snappy 컴프레서에 의해 사전 크기가 32,768 바이트로 제한되었으며 버전 1.1에서는 65,536 바이트로 업데이트되었습니다.

스냅 포맷에 대한 완전한 공식 설명은 Google GitHub [10]저장소에서 찾을 수 있습니다.

압축 스트림의 예

텍스트

위키피디아는 무료 웹 기반 협업 다국어 백과사전 프로젝트입니다.

다음과 같은 설명이 포함된 16진수 데이터로 압축할 수 있습니다.

0000000: ca02 f042 5769 6b69 7065 6469 6120 6973...BWikipedia는

첫 번째 2바이트 ca02는 little-endian varint의 길이입니다(varint [8]사양에 대해서는 Protocol Buffers 참조).따라서 가장 중요한 바이트는 '02'입니다. 0x02ca(varint) = 0x014a = 330바이트입니다.다음 2바이트 0xf042는 66+1바이트의 리터럴이 이어지는 것을 나타냅니다.

0000010: 2061 2066 72652c 2077 6562 2d62 6173 a web-bas 0000020: 6564 2c20 636f 6162 6f72 6174 6976ed, collaborativ 0000030: 652c 206d 756c 7469c 69e 7561 e620e 6176c 6176 e, 다국어 00000e프로제

0x09는 길이 - 4 = 0102 = 210 및 오프셋 = 0x03f = 63 또는 "pedia"인 유형 01의 태그 바이트입니다.
0µ014는 길이가 20+1바이트인 리터럴입니다.

0000050: 6374 2e00 0000 0000 0000 0000 ct. 

이 예에서는 4글자 이상의 공통 서브스트링이 압축 프로세스에 의해 모두 삭제되었습니다.일반적인 압축기가 더 잘 압축할 수 있습니다.gzip 및 bzip2와 같은 압축 방식과 달리 비트스트림에 알파벳을 패킹하기 위해 사용되는 엔트로피 인코딩은 없습니다.

인터페이스

스냅 배포에는 C++ 및 C 바인딩이 포함됩니다.서드파티에 의해 제공되는 바인딩 및 포트에는[11] C#, Common Lisp, Crystal(프로그래밍 언어), Erlang, Go, Haskell, Lua, Java, Nim, Node.js, Perl, PHP, Python, R, R, Ruby, Rust, SmallOpenCL포함됩니다.[12][13]

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Releases - google/snappy". Retrieved 4 January 2022 – via GitHub.
  2. ^ "Google Snappy–A Fast Compressing Library". InfoQ. Retrieved August 1, 2011.
  3. ^ Google 오픈 소스 MapReduce 압축. 속도를 명분으로 // 등록부, 2011-03-24
  4. ^ "Snappy: A fast compressor/decompressor: Readme". Google Code. Archived from the original on September 8, 2015. Retrieved August 1, 2011."Snappy vs lzo vs zlib".
  5. ^ "ColumnStore Storage Architecture". MariaDB KnowledgeBase.
  6. ^ 빠른 압축기/압축 해제기 - Google 코드의 프로젝트 페이지
  7. ^ "Add a loop alignment directive to work around a performance regression. · google/snappy@824e671". GitHub.
  8. ^ a b "Protocol Buffers - Encoding: Protocol Buffers Encoding Explained".
  9. ^ "GitHub - google/snappy: A fast compressor/decompressor". November 11, 2019 – via GitHub.
  10. ^ "Introduction". GitHub. 26 October 2021.
  11. ^ "snappy". snappy.
  12. ^ "Xilinx". Xilinx.
  13. ^ "InAccel". InAccel.

외부 링크