맨위로가기

스내피 (압축)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

스내피(Snappy)는 바이트 지향 방식으로 작동하며, 허프만 코딩이나 산술 부호화와 같은 엔트로피 부호화를 사용하지 않는 압축 알고리즘이다. 스내피는 스트림 형식과 프레이밍 형식을 지원하며, 스트림 형식은 리터럴, 복사 등의 요소 유형을 사용하여 데이터를 인코딩한다. 프레이밍 형식은 데이터를 청크로 분할하고, 각 청크는 헤더와 데이터를 포함하며, 데이터 무결성을 위해 CRC-32C 체크섬을 사용한다. C++ 및 C 바인딩을 포함하여 다양한 프로그래밍 언어 및 환경에서 사용할 수 있다.

더 읽어볼만한 페이지

  • 자유 압축 소프트웨어 - Gzip
    gzip은 DEFLATE 알고리즘을 기반으로 데이터를 압축하는 파일 형식으로, 매직 넘버, 헤더, 압축된 페이로드 등을 포함하며, 단일 파일 압축에 주로 사용되고 HTTP 압축 및 다양한 응용 분야에서 활용된다.
  • 자유 압축 소프트웨어 - Bzip2
    Bzip2는 줄리안 세워드가 개발한 자유 소프트웨어로, 버로우즈-휠러 변환, MTF 변환, 허프만 부호화 등의 압축 기법을 사용하여 gzip이나 ZIP보다 높은 압축률을 제공하지만 압축 속도가 느린 블록 정렬 압축 알고리즘이다.
  • C++ 라이브러리 - D-Bus
    D-Bus는 2002년에 시작된 프로세스 간 통신 시스템으로, 시스템 버스와 세션 버스를 통해 정보 공유, 모듈성, 권한 격리를 제공하며, 일대일 요청-응답 및 발행/구독 통신 방식을 지원한다.
  • C++ 라이브러리 - Botan
    Botan은 다양한 암호화 알고리즘을 지원하는 암호화 라이브러리이며, RSA, ElGamal, AES, SHA-256 등 널리 사용되는 알고리즘을 포함하여 공개키 암호화, 공개키 서명, 키 교환, 블록 사이퍼, 스트림 사이퍼, 해시 함수 등을 제공한다.
  • 아카이브 포맷 - ARJ
    ARJ는 다양한 소프트웨어 유틸리티에서 압축 해제가 가능한 파일 포맷으로, macOS에서는 독립 실행형 유틸리티를 통해 압축을 해제할 수 있다.
  • 아카이브 포맷 - JAR (파일 포맷)
    JAR (Java ARchive)는 자바 런타임 환경에서 애플리케이션 배포를 위해 사용되는 ZIP 기반의 파일 포맷으로, 자바 클래스 파일과 매니페스트 파일을 포함하여 메타데이터와 실행 정보를 관리하며, 압축 및 전자 서명을 지원하고 실행 가능한 JAR 파일을 통해 애플리케이션을 간편하게 실행할 수 있게 한다.
스내피 (압축) - [IT 관련 정보]에 관한 문서
개요
종류데이터 압축 라이브러리
개발사구글
최초 릴리스2011년 3월 18일
최신 버전1.1.10
최신 릴리스 날짜2023년 3월 9일
프로그래밍 언어C++
운영 체제크로스 플랫폼
라이선스아파치 라이선스 2.0 (최대 1.0.1 버전)
수정 BSD 라이선스
웹사이트스내피 공식 웹사이트
파일 포맷 정보
이름스내피 프레임
확장자.sz
MIME 형식application/x-snappy-framed
매직 넘버ff 06 00 00 73 4e 61 50 70 59 (FF 06 00 00 "sNaPpY")
공개 여부
개방 여부
파일 포맷 문서스내피 프레임 포맷 설명

2. 스트림 형식

스내피 압축은 비트 지향 방식이 아닌 바이트 지향 방식이며(스트림에서 전체 바이트만 내보내거나 소비됨) 엔트로피 부호화와 같은 허프만 코딩이나 산술 부호화를 사용하지 않는다.[12][23]

스트림의 첫 번째 바이트는 압축되지 않은 데이터의 길이이며, 리틀 엔디안 가변 길이 정수로 저장된다.[12] 이 방식을 통해 가변 길이 코드를 사용할 수 있다. 각 바이트의 하위 7비트는 데이터에 사용되고, 상위 비트는 길이 필드의 끝을 나타내는 플래그이다.

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


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


복사는 사전(방금 압축 해제된 데이터)을 참조한다. 오프셋은 현재 위치에서 이미 압축 해제된 스트림으로의 이동이다. 길이는 사전에서 복사할 바이트 수이다. 사전의 크기는 1.0 스내피 압축기에서 32,768바이트로 제한되었고, 버전 1.1에서 65,536바이트로 업데이트되었다.

2. 1. 기본 구조

스내피 압축은 비트 지향 방식이 아닌 바이트 지향 방식이며 허프만 코딩이나 산술 부호화와 같은 엔트로피 부호화를 사용하지 않는다.[12][23]

스트림의 첫 번째 바이트는 압축되지 않은 데이터의 길이이며, 리틀 엔디안 가변 길이 정수로 저장된다.[12] 이 방식을 통해 가변 길이 코드를 사용할 수 있다. 각 바이트의 하위 7비트는 데이터에 사용되고, 상위 비트는 길이 필드의 끝을 나타내는 플래그이다.

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

  • 00 - ''리터럴'' - 압축되지 않은 데이터.
  • 01 - 길이는 3비트로, 오프셋은 11비트로 저장된 복사.
  • 10 - 길이는 태그 바이트의 6비트로, 오프셋은 태그 바이트 다음의 2바이트 정수로 저장된 복사.
  • 11 - 길이는 태그 바이트의 6비트로, 오프셋은 태그 바이트 다음의 4바이트 리틀 엔디안 정수로 저장된 복사.


복사는 사전(방금 압축 해제된 데이터)을 참조한다. 오프셋은 현재 위치에서 이미 압축 해제된 스트림으로의 이동이다. 길이는 사전에서 복사할 바이트 수이다.

2. 2. 요소 유형

스내피 압축 스트림의 나머지 바이트는 4가지 요소 유형 중 하나를 사용하여 인코딩된다. 요소 유형은 요소의 첫 번째 바이트(''태그 바이트'')의 하위 2비트에 인코딩된다.[11][24]

  • 00 - ''리터럴'': 압축되지 않은 데이터. 상위 6비트는 데이터의 길이(len-1)를 저장하는 데 사용된다. 60보다 큰 길이는 60(1바이트)에서 63(4바이트)까지 6비트 길이를 나타내는 1~4바이트 정수로 저장된다.
  • 01 - 길이 및 1바이트 오프셋 복사: 길이는 3비트로, 오프셋은 11비트로 저장된 복사. 태그 바이트 다음의 1바이트는 오프셋의 일부로 사용된다.
  • 10 - 길이 및 2바이트 오프셋 복사: 길이는 태그 바이트의 6비트로, 오프셋은 태그 바이트 다음의 2바이트 정수로 저장된 복사.
  • 11 - 길이 및 4바이트 오프셋 복사: 길이는 태그 바이트의 6비트로, 오프셋은 태그 바이트 다음의 4바이트 리틀 엔디안 정수로 저장된 복사.


복사는 사전(방금 압축 해제된 데이터)을 참조한다. 오프셋은 현재 위치에서 이미 압축 해제된 스트림으로의 이동이다. 길이는 사전에서 복사할 바이트 수이다.

2. 3. 복사 참조

복사는 사전(방금 압축 해제된 데이터)을 참조한다.[12] 오프셋은 현재 위치에서 이미 압축 해제된 스트림으로의 이동이다. 길이는 사전에서 복사할 바이트 수이다. 사전의 크기는 스내피 버전 1.0에서 32,768바이트로 제한되었고, 버전 1.1에서 65,536바이트로 업데이트되었다.

3. 압축 스트림 예시

"Wikipedia is a free, web-based, collaborative, multilingual encyclopedia project." 문자열을 스내피(Snappy)로 압축하는 과정은 다음과 같다.

먼저, 압축되지 않은 데이터의 길이는 가변 길이 정수(varint)로 표현된다.[12][1] 이 경우, 압축되지 않은 데이터의 길이는 81바이트(5116)이다.

첫 번째 블록은 리터럴(literal)로, 'f042'로 표현된다. 첫 바이트 'f0'16은 길이-1 = 1111002, type=002을 나타낸다. type 002은 리터럴을 의미하며, 길이-1 (1111002=60)은 길이가 다음 바이트에서 읽힘을 의미한다. 다음 바이트 4216는 66을 의미한다. 따라서 "Wikipedia is a free, web-based, collaborative, multilingual encyclo" 66바이트가 이어진다.[12][2]

```hexdump

000000 51 f0 42 57 69 6b 69 70 65 64 69 61 20 69 73 20 >Q.BWikipedia is <

000010 61 20 66 72 65 65 2c 20 77 65 62 2d 62 61 73 65 >a free, web-base<

000020 64 2c 20 63 6f 6c 6c 61 62 6f 72 61 74 69 76 65 >d, collaborative<

000030 2c 20 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 20 65 >, multilingual e<

```

다음 블록의 헤더는 '093f'이다. 0916 ⇒ offh=0002, len-4=0102; type=012이다. type 1은 "1바이트 오프셋으로 복사"를 나타낸다. 복사할 길이는 0102+4=6바이트이고, 오프셋은 offh가 상위 비트이고 다음 바이트 '3f'가 하위 비트인 11비트 정수이다. 따라서 {offh}{3f16}=000001111112=63이다.[12][3] 즉, 63바이트 전부터 6바이트를 복사하여 "pedia "를 생성한다.

```hexdump

000040 6e 63 79 63 6c 6f 09 3f 1c 70 72 6f 6a 65 63 74 >ncyclo.?.project<

000050 2e >.<

```

그 다음, '1c'16 ⇒ len-1=0001112; type=002, 즉 길이 0001112+1=8인 리터럴이 온다.[12][4] 텍스트의 마지막 부분 "project."가 이어진다.

다른 예시로, "Wikipedia is a free, web-based, collaborative, multilingual encyclopedia project." 문자열 (총 330 바이트) 압축과정을 보면,

```hexdump

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

```

처음 두 바이트 ''ca02''는 압축 전 데이터 크기를 나타내는 리틀 엔디안 변형이다. 0x02ca = 0x014a = 330 바이트이다. 다음 두 바이트 0xf042는 66+1 바이트의 리터럴을 나타낸다.

```hexdump

0000010: 2061 2066 7265 652c 2077 6562 2d62 6173 a free, web-bas

0000020: 6564 2c20 636f 6c6c 6162 6f72 6174 6976 ed, collaborativ

0000030: 652c 206d 756c 7469 6c69 6e67 7561 6c20 e, multilingual

0000040: 656e 6379 636c 6f09 3ff0 1470 726f 6a65 encyclo.?..proje

```

72번째 바이트 0x09는 1형식의 태그 바이트로, 길이 - 4 = 0102 = 210, 오프셋 = 0x03f = 63, 즉, "pedia "이다. 74번째 바이트 0xf014는 20+1 바이트 길이의 리터럴이다.

```hexdump

0000050: 6374 2e00 0000 0000 0000 0000 0000 0000 ct.

```

이 예에서 4자 이상인 모든 공통 부분 문자열은 압축 처리로 제거되었다. 보다 일반적인 컴프레서는 이를 더 잘 압축할 수 있다. gzip이나 bzip2와 같은 압축 방법과는 달리, 알파벳을 비트 스트림으로 압축하기 위해 사용되는 엔트로피 부호는 없다.

4. 프레이밍 형식

스내피 스트림은 최대 4GiB-1 크기의 입력을 지원하지만,[12] 압축되지 않거나 불충분하게 압축된 섹션에 상당한 오버헤드를 추가할 수 있으며, 자체 식별 기능이 없고, 단순한 출력 크기 검사 이상의 데이터 무결성 메커니즘이 없다.[2]

이러한 문제를 해결하기 위해 스내피 프레이밍 형식[2] "스내피 프레임"을 사용할 수 있으며, 이는 입력을 최대 64KiB 크기의 청크로 분할하고,[2] 4바이트 블록 헤더(1바이트 식별자 및 3바이트 길이)로 구분한다:[2]


  • "스트림 식별자"는 유형 FF16이며 스트림을 시작해야 하며, ASCII로 "sNaPpY"로만 구성되어야 한다.[2]
  • 유형 0인 "압축된 데이터"는 압축된 스내피 스트림을 포함한다.[2]
  • 유형 1인 "압축되지 않은 데이터"는 출력에 그대로 복사할 데이터를 포함한다.[2]


두 유형의 데이터 청크는 압축되지 않은 데이터의 CRC-32C 체크섬도 포함한다.

2-7F16 유형의 청크는 예약되어 있으며 오류가 발생해야 한다.[2] 8016-FE16 유형의 청크는 해당 청크를 이해하지 못하는 압축 해제기에 의해 무시될 수 있다.[2]

4. 1. 프레이밍 형식 구조

스내피 프레이밍 형식[2]은 입력을 최대 64KiB 크기의 청크로 분할하고,[2] 4바이트 블록 헤더(1바이트 식별자 및 3바이트 길이)로 구분한다.[2]

  • "스트림 식별자"는 유형 FF16이며 스트림을 시작해야 하며, ASCII로 "sNaPpY"로만 구성되어야 한다.[2]
  • 유형 0인 "압축된 데이터"는 압축된 스내피 스트림을 포함한다.[2]
  • 유형 1인 "압축되지 않은 데이터"는 출력에 그대로 복사할 데이터를 포함한다.[2]


두 유형의 데이터 청크는 압축되지 않은 데이터의 CRC-32C 체크섬도 포함한다.

2-7F16 유형의 청크는 예약되어 있으며 오류가 발생해야 한다.[2] 8016-FE16 유형의 청크는 해당 청크를 이해하지 못하는 압축 해제기에 의해 무시될 수 있다.[2]

4. 2. 청크 유형

스내피 스트림은 최대 4GiB-1 크기의 입력을 지원하며,[12] 압축되지 않거나 불충분하게 압축된 섹션에 상당한 오버헤드를 추가할 수 있으며, 자체 식별 기능이 없고, 단순한 출력 크기 검사 이상의 데이터 무결성 메커니즘이 없다.[2]

이러한 문제를 해결하기 위해 스내피 프레이밍 형식[2] "스내피 프레임"을 사용할 수 있으며, 이는 입력을 최대 64KiB 크기의 청크로 분할하고,[2] 4바이트 블록 헤더(1바이트 식별자 및 3바이트 길이)로 구분한다:[2]

  • "스트림 식별자"는 유형 FF16이며 스트림을 시작해야 하며, ASCII로 "sNaPpY"로만 구성되어야 한다.[2]
  • 유형 0인 "압축된 데이터"는 압축된 스내피 스트림을 포함한다.[2]
  • 유형 1인 "압축되지 않은 데이터"는 출력에 그대로 복사할 데이터를 포함한다.[2]


두 유형의 데이터 청크는 압축되지 않은 데이터의 CRC-32C 체크섬도 포함한다.

2-7F16 유형의 청크는 예약되어 있으며 오류가 발생해야 한다.[2] 8016-FE16 유형의 청크는 해당 청크를 이해하지 못하는 압축 해제기에 의해 무시될 수 있다.[2]

4. 3. 체크섬

스내피는 압축되지 않은 데이터의 CRC-32C 체크섬을 포함한다.[2] 유형 0인 "압축된 데이터"와 유형 1인 "압축되지 않은 데이터" 청크 모두 압축되지 않은 데이터의 CRC-32C 체크섬을 포함한다.[2]

5. 인터페이스

스내피 배포판은 C++ 및 C 바인딩을 포함한다. 서드 파티에서 제공하는 바인딩 및 포트는 C#, Common Lisp, Crystal, Erlang, Go, Haskell, Lua, Java, Nim, Node.js, Perl, PHP, Python, R, Ruby, Rust, Smalltalk, OpenCL을 포함한다.[14][15][25] 명령 줄 인터페이스 프로그램도 사용할 수 있다.[16]

참조

[1] 웹사이트 Releases - google/snappy https://github.com/g[...] 2023-10-04
[2] 웹사이트 Snappy framing format description https://github.com/g[...] 2021-10-26
[3] 웹사이트 Google Snappy–A Fast Compressing Library http://www.infoq.com[...] 2011-08-01
[4] 뉴스 Google open sources MapReduce compression. In the name of speed https://www.theregis[...] The Register 2011-03-24
[5] 웹사이트 Snappy: A fast compressor/decompressor: Readme https://github.com/g[...] 2011-08-01
[6] 웹사이트 ColumnStore Storage Architecture https://mariadb.com/[...]
[7] 문서 snappy. A fast compressor/decompressor https://google.githu[...]
[8] 웹사이트 Compression — Ceph Documentation https://docs.ceph.co[...] 2024-01-03
[9] 웹사이트 SnappyUtils.cpp - mozsearch https://searchfox.or[...] 2024-01-03
[10] 웹사이트 Add a loop alignment directive to work around a performance regression. · google/snappy@824e671 https://github.com/g[...]
[11] 웹사이트 GitHub - google/snappy: A fast compressor/decompressor https://github.com/g[...] 2019-11-11
[12] 웹사이트 Snappy compressed format description https://github.com/g[...] 2021-10-26
[13] 웹사이트 snappy http://google.github[...]
[14] 웹사이트 Xilinx https://github.com/X[...]
[15] 웹사이트 InAccel https://github.com/I[...]
[16] 웹사이트 snappy-tools: snappy(1): Snappy compression and decompression with and without framing https://sr.ht/~nabij[...] 2024-02-15
[17] 웹사이트 Google Snappy: 高速圧縮ライブラリ https://www.infoq.co[...] C4Media Inc. 2011-04-13
[18] 웹사이트 Google open sources MapReduce compression https://www.theregis[...] Situation Publishing 2011-03-24
[19] 웹사이트 snappy https://google.githu[...] 2023-12-14
[20] 웹사이트 LZO vs Snappy vs LZF vs ZLIB, A comparison of compression algorithms for fat cells in HBase https://blog.erdemag[...] Tumblr 2011-04-14
[21] 웹사이트 MariaDB Enterprise ColumnStore Storage Architecture https://mariadb.com/[...] MariaDB 2023-12-14
[22] 웹사이트 Add a loop alignment directive to work around a performance regression. · google/snappy@824e671 https://github.com/g[...] GitHub, Inc. 2017-08-24
[23] 웹사이트 Encoding https://protobuf.dev[...] Google LLC 2023-12-14
[24] 웹사이트 snappy/format_description.txt at 27f34a580be4a3becf5f8c0cba13433f53c21337 · google/snappy https://github.com/g[...] GitHub, Inc. 2023-12-14
[25] 웹사이트 Vitis_Libraries/data_compression at b7b347a00e24eacee2870c4a3ff55cd08870f364 · Xilinx/Vitis_Libraries https://github.com/X[...] GitHub, Inc. 2023-12-14
[26] 웹인용 Releases - google/snappy https://github.com/g[...] 2023-10-04



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com