Použití rozhraní API pro kompresi

Mnoho aplikací potřebuje bezeztrátovou kompresi dat a dekompresi. Rozhraní API pro kompresi to zjednodušuje zveřejněním algoritmů komprese Windows prostřednictvím veřejného rozhraní API. Každý algoritmus komprese má sadu vlastností, které řídí jeho chování. Rozhraní API pro kompresi zveřejňuje rozhraní, které vývojářům umožňuje nastavit nebo dotazovat hodnoty těchto vlastností. Všechny vlastnosti podporovaných algoritmů komprese mají výchozí hodnoty představující běžně používané hodnoty těchto vlastností. Pokud je vlastnost požadovaná pro kompresi i dekompresi, budou výchozí hodnoty identické a zajistí, že se pro kompresi a dekompresi použijí stejné hodnoty.

Výběr algoritmu komprese

Jakmile se vývojář rozhodne, že aplikace potřebuje komprimovat nebo dekomprimovat data, dalším krokem je zvolit algoritmus komprese. Toto může záviset na testech, aby se našla nejlepší kombinace výkonu, rychlosti, kompresního poměru a požadavků na paměť pro konkrétní aplikaci. Následující seznam poskytuje relativní porovnání algoritmů komprese, které aktuálně podporuje rozhraní API pro kompresi. Ne každá možnost je k dispozici pro každý algoritmus komprese a porovnání je přibližné, protože výkon může záviset na vstupních datech.

XPRESS (COMPRESS_ALGORITHM_XPRESS)

  • Velmi rychle s nízkými požadavky na prostředky
  • Střední poměr komprese
  • Vysoká komprese a rychlost dekomprese
  • Nízký požadavek na paměť
  • Podporuje možnost COMPRESS_INFORMATION_CLASS_LEVEL dostupné ve výčtu COMPRESS_INFORMATION_CLASS. Výchozí hodnota je (DWORD)0. U některých dat může hodnota (DWORD)1 zlepšit poměr komprese s mírně pomalejší rychlostí komprese.

XPRESS s Huffmanovým kódováním (COMPRESS_ALGORITHM_XPRESS_HUFF)

  • Poměr komprese je vyšší než COMPRESS_ALGORITHM_XPRESS
  • Střední poměr komprese
  • Střední až vysoká komprese a rychlost dekomprese
  • Nízký požadavek na paměť
  • Podporuje možnost COMPRESS_INFORMATION_CLASS_LEVEL v enumeraci COMPRESS_INFORMATION_CLASS. Výchozí hodnota je (DWORD)0. U některých dat může hodnota (DWORD)1 zlepšit poměr komprese s mírně pomalejší rychlostí komprese.

MSZIP (ALGORITMUS_KOMPRESNÍ_MSZIP)

  • Používá více prostředků než COMPRESS_ALGORITHM_XPRESS_HUFF
  • Vygeneruje komprimovaný blok podobný dokumentu RFC 1951.
  • Poměr komprese střední až vysoké
  • Střední rychlost komprese a vysoká rychlost dekomprese
  • Požadavek na střední paměť

LZMS (COMPRESS_ALGORITHM_LZMS)

  • Dobrý algoritmus, pokud velikost dat, která se mají komprimovat, je větší než 2 MB.
  • Vysoký poměr komprese
  • Nízká rychlost komprese a vysoká rychlost dekomprese
  • Požadavek na paměť střední až vysoký
  • Podporuje možnost COMPRESS_INFORMATION_CLASS_BLOCK_SIZE v rámci výčtu COMPRESS_INFORMATION_CLASS. Minimální velikost 1 MB je navržena tak, aby získala lepší poměr komprese.

Rozhodování o tom, jaký režim rozhraní API komprese se má použít

Jakmile vývojář vybere algoritmus komprese, dalším rozhodnutím je, které ze dvou režimů rozhraní API pro kompresi použít: režim vyrovnávací paměti nebo režim bloku. Režim vyrovnávací paměti byl vyvinut pro snadné použití a ve většině případů se doporučuje.

Režim vyrovnávací paměti automaticky rozdělí vstupní vyrovnávací paměť na bloky velikosti, která je vhodná pro vybraný algoritmus komprese. Režim vyrovnávací paměti automaticky formátuje a ukládá nekomprimovanou velikost vyrovnávací paměti do komprimované vyrovnávací paměti. Velikost komprimované vyrovnávací paměti se automaticky neuloží a aplikace ji musí uložit pro dekompresi. Nezahrnujte příznak COMPRESS_RAW do parametru algoritmu při volání CreateCompressor a CreateDecompressor pro použití režimu vyrovnávací paměti. Příklad kódu pro aplikaci v režimu vyrovnávací paměti naleznete v oddílu Použití rozhraní API komprese v režimu vyrovnávací paměti.

Režim blokování umožňuje vývojáři řídit velikost bloku, ale vyžaduje, aby aplikace prováděla více práce. Při použití režimu bloku musí aplikace při komprimaci rozdělit vstupní data na části s odpovídající velikostí a pak je při dekompresi umístit zpět. Režim bloku selže, pokud je velikost vstupní vyrovnávací paměti větší než interní velikost bloku algoritmu komprese. Vnitřní velikost bloku je 32 kB pro MSZIP a 1 GB pro algoritmy komprese XPRESS. Interní velikost bloku pro LZMS je konfigurovatelná až 64 GB s odpovídajícím nárůstem využití paměti. Velikost komprimované vyrovnávací paměti se automaticky neuloží a aplikace ji také potřebuje uložit pro dekompresi. Hodnota parametru UncompressedBufferSize v rámci Decompress musí být přesně rovná původní velikosti nekomprimovaných dat, nikoli pouze velikosti výstupního bufferu. To znamená, že aplikace by měla při použití režimu bloku uložit přesnou původní velikost nekomprimovaných dat a komprimovaných dat. Při volání CreateCompressor a CreateDecompressor pro použití blokového režimu zahrňte příznak COMPRESS_RAW do parametru Algoritmus. Příklad kódu aplikace v režimu bloku najdete v části Použití rozhraní API pro kompresi v režimu bloku.

Přidělení vlastní paměti

Aplikace v režimu blokového a vyrovnávacího paměťového režimu mají možnost určit vlastní funkci přidělování paměti při volání CreateCompressor a CreateDecompressor. Parametr AllocationRoutines určuje strukturu COMPRESS_ALLOCATION_ROUTINES, která obsahuje rutinu přidělování paměti. Aplikace pak může nastavit velikost bloku kompresoru pomocí SetCompressorInformation. Příklad jednoduché přizpůsobené rutiny přidělování najdete v části Použití rozhraní API pro kompresi v režimu bloku.