Uso de la API de compresión

Muchas aplicaciones deben usar la compresión y descompresión de datos sin pérdida. La API de compresión simplifica esto mediante la exposición de algoritmos de compresión de Windows a través de una API pública. Cada algoritmo de compresión tiene un conjunto de propiedades que controla su comportamiento. Compression API expone una interfaz que permite al desarrollador establecer o consultar los valores de estas propiedades. Todas las propiedades de los algoritmos de compresión admitidos tienen valores predeterminados que representan valores usados habitualmente de estas propiedades. Si se requiere una propiedad para la compresión y descompresión, los valores predeterminados serán idénticos, lo que garantiza que se usen valores idénticos para la compresión y descompresión.

Selección del algoritmo de compresión

Después de que un desarrollador decida que una aplicación necesita comprimir o descomprimir datos, el siguiente paso consiste en elegir un algoritmo de compresión. Esto puede depender de las pruebas para encontrar la combinación de rendimiento óptimo de velocidad, relación de compresión y requisito de memoria para una aplicación determinada. En la lista siguiente se proporciona una comparación relativa de los algoritmos de compresión admitidos actualmente por compression API. No todas las opciones están disponibles para cada algoritmo de compresión y la comparación es aproximada porque el rendimiento puede depender de los datos de entrada.

XPRESS (COMPRESS_ALGORITHM_XPRESS)

  • Muy rápido con requisitos de recursos bajos
  • Relación de compresión media
  • Altas velocidades de compresión y descompresión
  • Requisito de memoria baja
  • Admite la opción COMPRESS_INFORMATION_CLASS_LEVEL disponible en la enumeración COMPRESS_INFORMATION_CLASS . El valor predeterminado es (DWORD)0. Para algunos datos, el valor (DWORD)1 puede mejorar la relación de compresión con una velocidad de compresión ligeramente más lenta.

XPRESS con codificación Huffman (COMPRESS_ALGORITHM_XPRESS_HUFF)

  • La relación de compresión es mayor que COMPRESS_ALGORITHM_XPRESS
  • Relación de compresión media
  • Velocidades de compresión y descompresión media a alta
  • Requisito de memoria baja
  • Admite la opción COMPRESS_INFORMATION_CLASS_LEVEL en la enumeración COMPRESS_INFORMATION_CLASS . El valor predeterminado es (DWORD)0. Para algunos datos, el valor (DWORD)1 puede mejorar la relación de compresión con una velocidad de compresión ligeramente más lenta.

MSZIP (COMPRESS_ALGORITHM_MSZIP)

  • Usa más recursos que COMPRESS_ALGORITHM_XPRESS_HUFF
  • Genera un bloque comprimido similar a RFC 1951.
  • Relación de compresión media a alta
  • Velocidad de compresión media y alta velocidad de descompresión
  • Requisito de memoria media

LZMS (COMPRESS_ALGORITHM_LZMS)

  • Buen algoritmo si el tamaño de los datos que se van a comprimir es superior a 2 MB.
  • Relación de compresión alta
  • Baja velocidad de compresión y alta velocidad de descompresión
  • Requisito de memoria media a alta
  • Admite la opción COMPRESS_INFORMATION_CLASS_BLOCK_SIZE en la enumeración COMPRESS_INFORMATION_CLASS . Se recomienda un tamaño mínimo de 1 MB para obtener una mejor relación de compresión.

Decidir qué modo de API de compresión se va a usar

Después de que un desarrollador seleccione el algoritmo de compresión, la siguiente decisión es cuál de los dos modos de la API de compresión usar: modo de búfer o modo de bloqueo. El modo de búfer se desarrolló para facilitar el uso y se recomienda para la mayoría de los casos.

El modo de búfer divide automáticamente el búfer de entrada en bloques de un tamaño adecuado para el algoritmo de compresión seleccionado. El modo de búfer da formato automáticamente y almacena el tamaño del búfer sin comprimir en el búfer comprimido. El tamaño del búfer comprimido no se guarda automáticamente y la aplicación debe guardarlo para la descompresión. No incluya la marca COMPRESS_RAW en el parámetro Algorithm cuando llame a CreateCompressor y CreateDecompressor para usar el modo de búfer. Para obtener un ejemplo de código de una aplicación en modo de búfer, consulte la sección Uso de la API de compresión en modo de búfer .

El modo de bloqueo permite al desarrollador controlar el tamaño del bloque, pero requiere que la aplicación realice más trabajo. Cuando se usa el modo de bloque, la aplicación tiene que dividir los datos de entrada en partes de tamaño adecuado al comprimir y, a continuación, volver a colocar las piezas al descomprimir. Se produce un error en el modo de bloque si el tamaño del búfer de entrada es mayor que el tamaño de bloque interno del algoritmo de compresión. El tamaño de bloque interno es de 32 KB para MSZIP y 1 GB para los algoritmos de compresión XPRESS. El tamaño de bloque interno para LZMS se puede configurar hasta 64 GB con un aumento correspondiente en el uso de memoria. El tamaño del búfer comprimido no se guarda automáticamente y la aplicación también debe guardarlo para la descompresión. El valor del parámetro UncompressedBufferSize de Decompress debe ser exactamente igual al tamaño original de los datos sin comprimir y no solo el tamaño del búfer de salida. Esto significa que la aplicación debe guardar el tamaño original exacto de los datos sin comprimir, así como los datos comprimidos y el tamaño comprimido, al usar el modo de bloque. Incluya la marca COMPRESS_RAW en el parámetro Algorithm cuando llame a CreateCompressor y CreateDecompressor para usar el modo de bloque. Para obtener un ejemplo de código de una aplicación en modo de bloque, consulte la sección Using the Compression API in block mode (Uso de la API de compresión en modo de bloque ).

Asignación de memoria personalizada

Las aplicaciones en modo de búfer y de bloqueo tienen la opción de especificar una rutina de asignación de memoria personalizada cuando llaman a CreateCompressor y CreateDecompressor. El parámetro AllocationRoutines especifica la estructura COMPRESS_ALLOCATION_ROUTINES que contiene la rutina de asignación de memoria. A continuación, la aplicación puede establecer el tamaño del bloque para el compresor mediante SetCompressorInformation. Consulte la sección Using the Compression API in block mode (Uso de la API de compresión en modo de bloque ) para obtener un ejemplo de una rutina de asignación personalizada sencilla.