Verwenden der Komprimierungs-API

Viele Anwendungen müssen verlustfreie Datenkomprimierung und Dekomprimierung verwenden. Die Komprimierungs-API vereinfacht dies, indem Windows Komprimierungsalgorithmen über eine öffentliche API verfügbar gemacht werden. Jeder Komprimierungsalgorithmus verfügt über einen Satz von Eigenschaften, der sein Verhalten steuert. Die Komprimierungs-API macht eine Schnittstelle verfügbar, mit der der Entwickler die Werte dieser Eigenschaften festlegen oder abfragen kann. 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, um sicherzustellen, dass identische Werte für die Komprimierung und Dekomprimierung verwendet werden.

Auswählen des Komprimierungsalgorithmus

Nachdem ein Entwickler entschieden hat, dass eine Anwendung Daten komprimieren oder dekomprimieren muss, besteht der nächste Schritt in der 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 mit geringen Ressourcenanforderungen
  • Mittleres Komprimierungsverhältnis
  • Hohe Komprimierungs- und Dekomprimierungsgeschwindigkeiten
  • Geringer Arbeitsspeicherbedarf
  • Unterstützt die OPTION COMPRESS INFORMATION CLASS _ _ _ LEVEL, 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)

  • 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, der RFC 1951 ähnelt.
  • Mittleres bis hohes Komprimierungsverhältnis
  • Mittlere Komprimierungsgeschwindigkeit und hohe Dekomprimierungsgeschwindigkeit
  • Mittlerer Arbeitsspeicherbedarf

LZMS (COMPRESS _ ALGORITHM _ LZMS)

  • Ein guter Algorithmus, wenn die Größe der zu komprimierenden Daten über 2 MB liegt.
  • Hohes Komprimierungsverhältnis
  • Niedrige Komprimierungsgeschwindigkeit und hohe Dekomprimierungsgeschwindigkeit
  • Mittlerer bis hoher Arbeitsspeicherbedarf
  • Unterstützt die OPTION COMPRESS INFORMATION CLASS BLOCK _ _ _ _ SIZE in der COMPRESS INFORMATION _ _ CLASS-Enumeration. Es wird eine Mindestgröße von 1 MB empfohlen, um ein besseres Komprimierungsverhältnis zu erhalten.

Entscheidung für den zu verwendenden Komprimierungs-API-Modus

Nachdem ein Entwickler den Komprimierungsalgorithmus ausgewählt hat, ist die nächste Entscheidung, welcher der beiden Modi der Komprimierungs-API verwendet werden soll: Puffermodus oder Blockmodus. Der Puffermodus wurde zur einfacheren Verwendung entwickelt und wird in den meisten Fällen 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 unkomprimierte Puffergröße automatisch im komprimierten Puffer. Die Größe des komprimierten Puffers wird nicht automatisch gespeichert, und die Anwendung muss diesen für die Dekomprimierung speichern. Schließen Sie das COMPRESS _ RAW-Flag 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.

Mit dem Blockmodus kann der Entwickler die Blockgröße steuern, erfordert jedoch mehr Arbeit durch die Anwendung. Bei Verwendung des Blockmodus muss die Anwendung die Eingabedaten beim Komprimieren in Teile mit entsprechender Größe unterteilen und die Teile dann beim Dekomprimieren wieder zusammenlegen. Der Blockmodus schlägt fehl, wenn die Größe des Eingabepuffers größer als die interne Blockgröße des Komprimierungsalgorithmus ist. Die interne Blockgröße beträgt 32 KB für MSZIP und 1 GB für die XPRESS-Komprimierungsalgorithmen. Die interne Blockgröße für LZMS kann bis zu 64 GB bei entsprechender Zunahme der Arbeitsspeichernutzung konfiguriert werden. Die Größe des komprimierten Puffers wird nicht automatisch gespeichert, und die Anwendung muss diesen auch für die 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 entspricht. Dies bedeutet, dass Ihre Anwendung bei Verwendung des Blockmodus die genaue ursprüngliche Größe der unkomprimierten Daten sowie die komprimierten Daten und die komprimierte Größe speichern sollte. Schließen Sie das COMPRESS _ RAW-Flag in den Algorithmusparameter 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 Speicherzuweisung

Puffer- und Blockmodusanwendungen haben die Möglichkeit, eine benutzerdefinierte Speicherbelegungsroutine anzugeben, wenn sie CreateCompressor und CreateDecompressor aufrufen. Der AllocationRoutines-Parameter gibt die COMPRESS ALLOCATION _ _ ROUTINES-Struktur an, die die Speicherbelegungsroutine enthält. Die Anwendung kann dann mit SetCompressorInformationdie Blockgröße für die -Gruppe festlegen. Ein Beispiel für eine einfache benutzerdefinierte Zuordnungsroutine finden Sie im Abschnitt Verwenden der Komprimierungs-API im Blockmodus.