Zstandard es un algoritmo de compresión de datos sin pérdida desarrollado por Yann Collet en Facebook . Zstd es la implementación de referencia correspondiente en C , publicada como software de código abierto el 31 de agosto de 2016. [3] [4]
Zstandard fue diseñado para brindar una relación de compresión comparable a la del algoritmo DEFLATE (desarrollado en 1991 y utilizado en los programas ZIP y gzip originales ), pero más rápida, especialmente para la descompresión. Se puede ajustar con niveles de compresión que van desde -7 (el más rápido) [5] hasta 22 (el más lento en velocidad de compresión, pero con la mejor relación de compresión).
A partir de la versión 1.3.2 (octubre de 2017), zstd implementa opcionalmente una búsqueda y deduplicación de rango muy largo ( --long
ventana de 128 MiB) similar a rzip o lrzip . [6]
La velocidad de compresión puede variar en un factor de 20 o más entre los niveles más rápidos y más lentos, mientras que la descompresión es uniformemente rápida, variando menos del 20% entre los niveles más rápidos y más lentos. [7] La línea de comandos Zstandard tiene un --adapt
modo "adaptativo" ( ) que varía el nivel de compresión dependiendo de las condiciones de E/S, principalmente qué tan rápido puede escribir la salida.
Zstd en su nivel máximo de compresión proporciona una relación de compresión cercana a lzma , lzham y ppmx , y tiene un mejor rendimiento [ vago ] que lza o bzip2 . [¿ Síntesis incorrecta? ] [8] [9] Zstandard alcanza la frontera actual de Pareto , ya que se descomprime más rápido que cualquier otro algoritmo actualmente disponible con una relación de compresión similar o mejor. [10] [11]
Los diccionarios pueden tener un gran impacto en la tasa de compresión de archivos pequeños, por lo que Zstandard puede utilizar un diccionario de compresión proporcionado por el usuario. También ofrece un modo de entrenamiento, capaz de generar un diccionario a partir de un conjunto de muestras. [12] [13] En particular, se puede cargar un diccionario para procesar grandes conjuntos de archivos con redundancia entre archivos, pero no necesariamente dentro de cada archivo, por ejemplo, archivos de registro .
Zstandard combina una etapa de coincidencia de diccionarios ( LZ77 ) con una gran ventana de búsqueda y una etapa rápida de codificación de entropía . Utiliza tanto la codificación Huffman (usada para las entradas en la sección Literales) [14] como la entropía de estados finitos (FSE), una versión rápida en tablas de ANS, tANS , utilizada para las entradas en la sección Secuencias. Debido a la forma en que FSE transfiere el estado entre símbolos, la descompresión implica procesar los símbolos dentro de la sección Secuencias de cada bloque en orden inverso (del último al primero).
El kernel de Linux ha incluido Zstandard desde noviembre de 2017 (versión 4.14) como método de compresión para los sistemas de archivos btrfs y squashfs . [16] [17] [18]
En 2017, Allan Jude integró Zstandard en el núcleo de FreeBSD [19] y, posteriormente, se integró como una opción de compresión para volcados de memoria (tanto de programas de usuario como de pánicos de núcleo). También se utilizó para crear un método de compresión OpenZFS de prueba de concepto [7] que se integró en 2020. [20]
Las bases de datos AWS Redshift y RocksDB incluyen soporte para la compresión de campos mediante Zstandard. [21]
En marzo de 2018, Canonical probó [22] el uso de zstd como método de compresión de paquetes deb por defecto para la distribución Ubuntu Linux. En comparación con la compresión xz de paquetes deb, zstd en el nivel 19 descomprime significativamente más rápido, pero a costa de archivos de paquetes un 6% más grandes. Se agregó soporte a Debian (y posteriormente a Ubuntu) en abril de 2018 (en la versión 1.6~rc1). [23] [22] [24]
En 2018, el algoritmo se publicó como RFC 8478, que también define un tipo de medio asociado "application/zstd", una extensión de nombre de archivo "zst" y una codificación de contenido HTTP "zstd". [25]
Arch Linux agregó soporte para zstd como método de compresión de paquetes en octubre de 2019 con el lanzamiento del administrador de paquetes pacman 5.2 [26] y en enero de 2020 cambió de xz a zstd para los paquetes en el repositorio oficial. Arch usa zstd -c -T0 --ultra -20 -
, el tamaño de todos los paquetes comprimidos combinados aumentó en un 0.8% (en comparación con xz), la velocidad de descompresión es 14 veces más rápida, la memoria de descompresión aumentó en 50 MiB cuando se usan múltiples subprocesos, la memoria de compresión aumenta pero escala con la cantidad de subprocesos utilizados. [27] [28] [29] Arch Linux más tarde también cambió a zstd como algoritmo de compresión predeterminado para el generador de disco RAM inicial mkinitcpio . [30]
Fedora agregó soporte ZStandard a RPM en mayo de 2018 (versión 28 de Fedora) y lo utilizó para empaquetar la versión en octubre de 2019 (versión 31 de Fedora). [31] En Fedora 33, el sistema de archivos está comprimido de manera predeterminada con zstd. [32] [33]
La implementación completa del algoritmo con una opción para elegir el nivel de compresión se utiliza en los formatos de archivo .NSZ/.XCZ [34] desarrollados por la comunidad homebrew para la consola de juegos híbrida Nintendo Switch . [35] De manera similar, también es uno de los muchos algoritmos de compresión compatibles con el formato de archivo de imagen de disco .RVZ de Wii y GameCube .
El 15 de junio de 2020, Zstandard se implementó en la versión 6.3.8 del formato de archivo zip con el número de códec 93, dejando obsoleto el número de códec anterior de 20, ya que se implementó en la versión 6.3.7, lanzada el 1 de junio. [36] [37]
En marzo de 2024, la versión 123 de Google Chrome (y los navegadores basados en Chromium como Brave o Microsoft Edge ) agregaron soporte para zstd en el encabezado HTTP Content-Encoding
. [38] En mayo de 2024, la versión 126.0 de Firefox agregó soporte para zstd en el encabezado HTTP Content-Encoding
. [39]
La implementación de referencia está licenciada bajo la licencia BSD , publicada en GitHub . [40] Desde la versión 1.0, tenía una concesión adicional de derechos de patente. [41]
A partir de la versión 1.3.1, [42] esta concesión de patente se abandonó y la licencia se cambió a una licencia dual BSD + GPLv2. [43]
Los desarrolladores de Canonical están considerando una excepción de congelamiento de funciones para obtener este soporte Zstd Apt/Dpkg recientemente desarrollado en Ubuntu 18.04 LTS. Al hacerlo, mencionan que buscarían habilitar la compresión Zstd para paquetes de forma predeterminada en Ubuntu 18.10.