압축 API 사용

많은 애플리케이션에서 무손실 데이터 압축 및 압축 해제를 사용해야 합니다. 압축 API는 공용 API를 통해 Windows 압축 알고리즘을 노출하여 이를 간소화합니다. 각 압축 알고리즘에는 동작을 제어하는 속성 집합이 있습니다. 압축 API는 개발자가 이러한 속성의 값을 설정하거나 쿼리할 수 있도록 하는 인터페이스를 노출합니다. 지원되는 압축 알고리즘의 모든 속성에는 이러한 속성의 일반적으로 사용되는 값을 나타내는 기본값이 있습니다. 압축 및 압축 해제 모두에 속성이 필요한 경우 기본값은 동일하므로 압축 및 압축 해제에 동일한 값이 사용됩니다.

압축 알고리즘 선택

개발자가 애플리케이션에서 데이터를 압축하거나 압축 해제해야 한다고 결정한 후 다음 단계는 압축 알고리즘을 선택하는 것입니다. 이는 특정 애플리케이션에 대한 속도, 압축 비율 및 메모리 요구 사항의 가장 성능이 뛰어난 조합을 찾기 위한 테스트에 따라 달라질 수 있습니다. 다음 목록에서는 압축 API에서 현재 지원되는 압축 알고리즘을 상대적으로 비교합니다. 모든 압축 알고리즘에 모든 옵션을 사용할 수 있는 것은 아니며 성능이 입력 데이터에 따라 달라질 수 있으므로 비교는 근사합니다.

XPRESS(COMPRESS_ALGORITHM_XPRESS)

  • 리소스 요구 사항이 낮을 때 매우 빠름
  • 중간 압축 비율
  • 높은 압축 및 압축 해제 속도
  • 메모리 부족 요구 사항
  • COMPRESS_INFORMATION_CLASS 열거형에서 사용할 수 있는 COMPRESS_INFORMATION_CLASS_LEVEL 옵션을 지원합니다. 기본값은 (DWORD)0입니다. 일부 데이터의 경우 값 (DWORD)1 은 압축 속도가 약간 느린 압축 비율을 향상시킬 수 있습니다.

Huffman 인코딩을 사용한 XPRESS(COMPRESS_ALGORITHM_XPRESS_HUFF)

  • 압축 비율이 COMPRESS_ALGORITHM_XPRESS보다 높습니다.
  • 중간 압축 비율
  • 중간에서 높은 압축 및 압축 해제 속도
  • 메모리 부족 요구 사항
  • COMPRESS_INFORMATION_CLASS 열거형에서 COMPRESS_INFORMATION_CLASS_LEVEL 옵션을 지원합니다. 기본값은 (DWORD)0입니다. 일부 데이터의 경우 값 (DWORD)1 은 압축 속도가 약간 느린 압축 비율을 향상시킬 수 있습니다.

MSZIP(COMPRESS_ALGORITHM_MSZIP)

  • COMPRESS_ALGORITHM_XPRESS_HUFF 것보다 더 많은 리소스를 사용합니다.
  • RFC 1951과 유사한 압축 블록을 생성합니다.
  • 중간에서 높은 압축 비율
  • 중간 압축 속도 및 높은 압축 속도
  • 중간 메모리 요구 사항

LZMS(COMPRESS_ALGORITHM_LZMS)

  • 압축할 데이터의 크기가 2MB를 초과하면 좋은 알고리즘입니다.
  • 높은 압축 비율
  • 낮은 압축 속도 및 높은 압축 해제 속도
  • 보통에서 높은 메모리 요구 사항
  • COMPRESS_INFORMATION_CLASS 열거형에서 COMPRESS_INFORMATION_CLASS_BLOCK_SIZE 옵션을 지원합니다. 더 나은 압축 비율을 얻으려면 최소 크기가 1MB인 것이 좋습니다.

사용할 압축 API 모드 결정

개발자가 압축 알고리즘을 선택한 후 다음 결정은 사용할 압축 API의 두 가지 모드 중 버퍼 모드 또는 블록 모드입니다. 버퍼 모드는 사용 편의성을 위해 개발되었으며 대부분의 경우 권장됩니다.

버퍼 모드는 입력 버퍼를 선택한 압축 알고리즘에 적합한 크기의 블록으로 자동으로 분할합니다. 버퍼 모드는 압축되지 않은 버퍼 크기를 압축된 버퍼에 자동으로 포맷하고 저장합니다. 압축된 버퍼의 크기는 자동으로 저장되지 않으며 애플리케이션은 압축 해제를 위해 이를 저장해야 합니다. 버퍼 모드를 사용하기 위해 CreateCompressor 및 CreateDecompressor를 호출할 때 Algorithm 매개 변수에 COMPRESS_RAW 플래그를 포함하지 마세요. 버퍼 모드 애플리케이션의 코드 예제는 버퍼 모드에서 압축 API 사용 섹션을 참조하세요.

블록 모드를 사용하면 개발자가 블록 크기를 제어할 수 있지만 애플리케이션에서 더 많은 작업을 수행해야 합니다. 블록 모드를 사용하는 경우 애플리케이션은 압축할 때 입력 데이터를 적절한 크기의 조각으로 분할한 다음 압축을 풀 때 조각을 다시 함께 넣어야 합니다. 입력 버퍼의 크기가 압축 알고리즘의 내부 블록 크기보다 크면 블록 모드가 실패합니다. 내부 블록 크기는 MSZIP의 경우 32KB이고 XPRESS 압축 알고리즘의 경우 1GB입니다. LZMS의 내부 블록 크기는 메모리 사용량이 증가하여 최대 64GB까지 구성할 수 있습니다. 압축된 버퍼의 크기는 자동으로 저장되지 않으며 애플리케이션은 압축 해제를 위해 이를 저장해야 합니다. 압축 해제의 UncompressedBufferSize 매개 변수 값은 출력 버퍼의 크기뿐만 아니라 압축되지 않은 데이터의 원래 크기와 정확히 같아야 합니다. 즉, 블록 모드를 사용할 때 애플리케이션은 압축되지 않은 데이터의 정확한 원래 크기뿐만 아니라 압축된 데이터 및 압축된 크기를 저장해야 합니다. 블록 모드를 사용하기 위해 CreateCompressor 및 CreateDecompressor를 모두 호출할 때 Algorithm 매개 변수에 COMPRESS_RAW 플래그를 포함합니다. 블록 모드 애플리케이션의 코드 예제는 블록 모드에서 압축 API 사용 섹션을 참조하세요.

사용자 지정 메모리 할당

버퍼 및 블록 모드 애플리케이션에는 CreateCompressor 및 CreateDecompressor를 호출할 때 사용자 지정 메모리 할당 루틴을 지정하는 옵션이 있습니다. AllocationRoutines 매개 변수는 메모리 할당 루틴을 포함하는 COMPRESS_ALLOCATION_ROUTINES 구조를 지정합니다. 그런 다음, 애플리케이션은 SetCompressorInformation을 사용하여 압축기의 블록 크기를 설정할 수 있습니다. 간단한 사용자 지정 할당 루틴의 예는 블록 모드에서 압축 API 사용 섹션을 참조하세요.