Verwenden der Komprimierungs-API

Viele Anwendungen müssen eine verlustfreie Datenkomprimierung und -dekomprimierung verwenden. Die Komprimierungs-API vereinfacht dies, indem sie Windows-Komprimierungsalgorithmen über eine öffentliche API verfügbar macht. Jeder Komprimierungsalgorithmus verfügt über eine Reihe von Eigenschaften, die sein Verhalten steuern. Die Komprimierungs-API macht eine Schnittstelle verfügbar, die es dem Entwickler ermöglicht, die Werte dieser Eigenschaften festzulegen oder abzufragen. Alle Eigenschaften für die unterstützten Komprimierungsalgorithmen verfügen über Standardwerte, die häufig verwendete Werte dieser Eigenschaften darstellen. Wenn eine Eigenschaft sowohl für die Komprimierung als auch für die Dekomprimierung erforderlich ist, sind die Standardwerte identisch, sodass identische Werte für Komprimierung und Dekomprimierung verwendet werden.

Auswählen des Komprimierungsalgorithmus

Nachdem ein Entwickler entschieden hat, dass eine Anwendung Daten komprimieren oder dekomprimieren muss, ist der nächste Schritt die Auswahl eines Komprimierungsalgorithmus. Dies kann von Tests abhängen, um die beste Kombination aus Geschwindigkeit, Komprimierungsverhältnis und Arbeitsspeicheranforderungen für eine bestimmte Anwendung zu finden. Die folgende Liste enthält einen relativen Vergleich der Komprimierungsalgorithmen, die derzeit von der Komprimierungs-API unterstützt werden. Nicht jede Option ist für jeden Komprimierungsalgorithmus verfügbar, und der Vergleich ist ungefähr, da die Leistung von den Eingabedaten abhängen kann.

XPRESS (COMPRESS_ALGORITHM_XPRESS)

  • Sehr schnell bei geringem Ressourcenbedarf
  • Mittleres Komprimierungsverhältnis
  • Hohe Komprimierungs- und Dekomprimierungsgeschwindigkeiten
  • Geringer Arbeitsspeicherbedarf
  • Unterstützt die COMPRESS_INFORMATION_CLASS_LEVEL-Option , die in der COMPRESS_INFORMATION_CLASS-Enumeration verfügbar ist. Der Standardwert ist (DWORD)0. Bei einigen Daten kann der Wert (DWORD)1 das Komprimierungsverhältnis mit einer etwas langsameren Komprimierungsgeschwindigkeit verbessern.

XPRESS mit Huffman-Codierung (COMPRESS_ALGORITHM_XPRESS_HUFF)

  • Das Komprimierungsverhältnis ist höher als COMPRESS_ALGORITHM_XPRESS
  • Mittleres Komprimierungsverhältnis
  • Mittlere bis hohe Komprimierungs- und Dekomprimierungsgeschwindigkeiten
  • Geringer Arbeitsspeicherbedarf
  • Unterstützt die Option COMPRESS_INFORMATION_CLASS_LEVEL in der COMPRESS_INFORMATION_CLASS-Enumeration . Der Standardwert ist (DWORD)0. Bei einigen Daten kann der Wert (DWORD)1 das Komprimierungsverhältnis mit einer etwas langsameren Komprimierungsgeschwindigkeit verbessern.

MSZIP (COMPRESS_ALGORITHM_MSZIP)

  • Verwendet mehr Ressourcen als COMPRESS_ALGORITHM_XPRESS_HUFF
  • Generiert einen komprimierten Block ähnlich RFC 1951.
  • Mittleres bis hohes Komprimierungsverhältnis
  • Mittlere Komprimierungsgeschwindigkeit und hohe Dekompressionsgeschwindigkeit
  • Mittlerer Arbeitsspeicherbedarf

LZMS (COMPRESS_ALGORITHM_LZMS)

  • Guter Algorithmus, wenn die Größe der zu komprimierenden Daten mehr als 2 MB beträgt.
  • Hohes Komprimierungsverhältnis
  • Niedrige Komprimierungsgeschwindigkeit und hohe Dekompressionsgeschwindigkeit
  • Mittlerer bis hoher Arbeitsspeicherbedarf
  • Unterstützt die Option COMPRESS_INFORMATION_CLASS_BLOCK_SIZE in der COMPRESS_INFORMATION_CLASS-Enumeration . Eine Mindestgröße von 1 MB wird empfohlen, um ein besseres Komprimierungsverhältnis zu erhalten.

Entscheiden, welcher Komprimierungs-API-Modus verwendet werden soll

Nachdem ein Entwickler den Komprimierungsalgorithmus ausgewählt hat, wird als nächstes entschieden, welcher der beiden Modi der Komprimierungs-API verwendet werden soll: Puffermodus oder Blockmodus. Der Puffermodus wurde aus Gründen der Benutzerfreundlichkeit entwickelt und wird für die meisten Fälle empfohlen.

Der Puffermodus teilt den Eingabepuffer automatisch in Blöcke einer Größe auf, die für den ausgewählten Komprimierungsalgorithmus geeignet ist. Der Puffermodus formatiert und speichert die nicht komprimierte Puffergröße automatisch im komprimierten Puffer. Die Größe des komprimierten Puffers wird nicht automatisch gespeichert, und die Anwendung muss diese zur Dekomprimierung speichern. Schließen Sie das Flag COMPRESS_RAW nicht in den Algorithmusparameter ein, wenn Sie CreateCompressor und CreateDecompressor aufrufen, um den Puffermodus zu verwenden. Ein Codebeispiel für eine Puffermodusanwendung finden Sie im Abschnitt Verwenden der Komprimierungs-API im Puffermodus .

Der Blockmodus ermöglicht es dem Entwickler, die Blockgröße zu steuern, erfordert jedoch mehr Arbeit von der Anwendung. Beim Verwenden des Blockmodus muss die Anwendung die Eingabedaten beim Komprimieren in entsprechend große Teile aufteilen und die Teile dann beim Dekomprimieren wieder zusammensetzen. Der Blockmodus schlägt fehl, wenn die Größe des Eingabepuffers größer ist als die interne Blockgröße des Komprimierungsalgorithmus. Die interne Blockgröße beträgt 32 KB für das MSZIP und 1 GB für die XPRESS-Komprimierungsalgorithmen. Die interne Blockgröße für LZMS ist bis zu 64 GB konfigurierbar, mit einer entsprechenden Erhöhung der Arbeitsspeichernutzung. Die Größe des komprimierten Puffers wird nicht automatisch gespeichert, und die Anwendung muss diese auch zur Dekomprimierung speichern. Der Wert des UncompressedBufferSize-Parameters von Decompress muss genau der ursprünglichen Größe der nicht komprimierten Daten und nicht nur der Größe des Ausgabepuffers entsprechen. Dies bedeutet, dass Ihre Anwendung die genaue Originalgröße der nicht komprimierten Daten sowie die komprimierten Daten und die komprimierte Größe speichern sollte, wenn Sie den Blockmodus verwenden. Fügen Sie das flag COMPRESS_RAW in den Algorithm-Parameter ein, wenn Sie sowohl CreateCompressor als auch CreateDecompressor aufrufen, um den Blockmodus zu verwenden. Ein Codebeispiel für eine Blockmodusanwendung finden Sie im Abschnitt Verwenden der Komprimierungs-API im Blockmodus .

Benutzerdefinierte Speicherzuordnung

Puffer- und Blockmodusanwendungen haben die Möglichkeit, eine benutzerdefinierte Speicherzuordnungsroutine anzugeben, wenn sie CreateCompressor und CreateDecompressor aufrufen. Der Parameter AllocationRoutines gibt die COMPRESS_ALLOCATION_ROUTINES Struktur an, die die Speicherzuordnungsroutine enthält. Die Anwendung kann dann die Blockgröße für den Kompressor mithilfe von SetCompressorInformation festlegen. Ein Beispiel für eine einfache benutzerdefinierte Zuordnungsroutine finden Sie im Abschnitt Verwenden der Komprimierungs-API im Blockmodus .