Partager via


Utilisation de l’API compression

De nombreuses applications doivent utiliser la compression et la décompression des données sans perte. L’API compression simplifie cela en exposant les algorithmes de compression Windows via une API publique. Chaque algorithme de compression a un ensemble de propriétés qui contrôle son comportement. L’API Compression expose une interface qui permet au développeur de définir ou d’interroger les valeurs de ces propriétés. Toutes les propriétés des algorithmes de compression pris en charge ont des valeurs par défaut représentant les valeurs couramment utilisées de ces propriétés. Si une propriété est requise pour la compression et la décompression, les valeurs par défaut sont identiques, ce qui garantit que les valeurs identiques sont utilisées pour la compression et la décompression.

Sélection de l’algorithme de compression

Une fois qu’un développeur a décidé qu’une application doit compresser ou décompresser des données, l’étape suivante consiste à choisir un algorithme de compression. Cela peut dépendre des tests permettant de trouver la combinaison la plus performante de vitesse, de taux de compression et de mémoire requise pour une application particulière. La liste suivante fournit une comparaison relative des algorithmes de compression actuellement pris en charge par l’API compression. Toutes les options ne sont pas disponibles pour chaque algorithme de compression, et la comparaison est approximative, car les performances peuvent dépendre des données d’entrée.

XPRESS (COMPRESS_ALGORITHM_XPRESS)

  • Très rapide avec de faibles besoins en ressources
  • Taux de compression moyen
  • Vitesses élevées de compression et de décompression
  • Besoin de mémoire faible
  • Prend en charge l’option COMPRESS_INFORMATION_CLASS_LEVEL disponible dans l’énumération COMPRESS_INFORMATION_CLASS . La valeur par défaut est (DWORD)0. Pour certaines données, la valeur (DWORD)1 peut améliorer le taux de compression avec une vitesse de compression légèrement plus lente.

XPRESS avec encodage Huffman (COMPRESS_ALGORITHM_XPRESS_HUFF)

  • Le taux de compression est supérieur à COMPRESS_ALGORITHM_XPRESS
  • Taux de compression moyen
  • Vitesse de compression et de décompression moyenne à élevée
  • Besoin de mémoire faible
  • Prend en charge l’option COMPRESS_INFORMATION_CLASS_LEVEL dans l’énumération COMPRESS_INFORMATION_CLASS . La valeur par défaut est (DWORD)0. Pour certaines données, la valeur (DWORD)1 peut améliorer le taux de compression avec une vitesse de compression légèrement plus lente.

MSZIP (COMPRESS_ALGORITHM_MSZIP)

  • Utilise plus de ressources que COMPRESS_ALGORITHM_XPRESS_HUFF
  • Génère un bloc compressé similaire à RFC 1951.
  • Taux de compression moyen à élevé
  • Vitesse de compression moyenne et vitesse de décompression élevée
  • Mémoire moyenne requise

LZMS (COMPRESS_ALGORITHM_LZMS)

  • Bon algorithme si la taille des données à compresser est supérieure à 2 Mo.
  • Taux de compression élevé
  • Vitesse de compression faible et vitesse de décompression élevée
  • Besoin de mémoire moyen à élevé
  • Prend en charge l’option COMPRESS_INFORMATION_CLASS_BLOCK_SIZE dans l’énumération COMPRESS_INFORMATION_CLASS . Une taille minimale de 1 Mo est suggérée pour obtenir un meilleur taux de compression.

Choix du mode d’API compression à utiliser

Une fois qu’un développeur a sélectionné l’algorithme de compression, la décision suivante consiste à choisir parmi les deux modes de l’API de compression à utiliser : mode mémoire tampon ou mode bloc. Le mode mémoire tampon a été développé pour faciliter l’utilisation et est recommandé dans la plupart des cas.

Le mode mémoire tampon fractionne automatiquement la mémoire tampon d’entrée en blocs d’une taille appropriée pour l’algorithme de compression sélectionné. Le mode mémoire tampon met en forme et stocke automatiquement la taille de la mémoire tampon non compressée dans la mémoire tampon compressée. La taille de la mémoire tampon compressée n’est pas automatiquement enregistrée, et l’application doit l’enregistrer pour la décompression. N’incluez pas l’indicateur COMPRESS_RAW dans le paramètre Algorithm lorsque vous appelez CreateCompressor et CreateDecompressor pour utiliser le mode mémoire tampon. Pour obtenir un exemple de code d’une application en mode mémoire tampon, consultez la section Utilisation de l’API compression en mode tampon .

Le mode Bloc permet au développeur de contrôler la taille du bloc, mais nécessite davantage de travail de la part de l’application. Lors de l’utilisation du mode bloc, l’application doit diviser les données d’entrée en morceaux de taille appropriée lors de la compression, puis ressasser les éléments lors de la décompression. Le mode bloc échoue si la taille de la mémoire tampon d’entrée est supérieure à la taille de bloc interne de l’algorithme de compression. La taille de bloc interne est de 32 Ko pour MSZIP et de 1 Go pour les algorithmes de compression XPRESS. La taille de bloc interne pour LZMS est configurable jusqu’à 64 Go avec une augmentation correspondante de l’utilisation de la mémoire. La taille de la mémoire tampon compressée n’est pas automatiquement enregistrée, et l’application doit également l’enregistrer pour la décompression. La valeur du paramètre UncompressedBufferSize de Decompress doit être exactement égale à la taille d’origine des données non compressées et pas seulement à la taille de la mémoire tampon de sortie. Cela signifie que votre application doit enregistrer la taille d’origine exacte des données non compressées, ainsi que les données compressées et la taille compressée, lors de l’utilisation du mode bloc. Incluez l’indicateur COMPRESS_RAW dans le paramètre Algorithm lorsque vous appelez CreateCompressor et CreateDecompressor pour utiliser le mode bloc. Pour obtenir un exemple de code d’une application en mode bloc, consultez la section Utilisation de l’API Compression en mode bloc .

Allocation de mémoire personnalisée

Les applications en mode mémoire tampon et bloc ont la possibilité de spécifier une routine d’allocation de mémoire personnalisée lorsqu’elles appellent CreateCompressor et CreateDecompressor. Le paramètre AllocationRoutines spécifie la structure COMPRESS_ALLOCATION_ROUTINES qui contient la routine d’allocation de mémoire. L’application peut ensuite définir la taille de bloc du compresseur à l’aide de SetCompressorInformation. Consultez la section Utilisation de l’API compression en mode bloc pour obtenir un exemple de routine d’allocation personnalisée simple.