Zstandard

Summary

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.[2][3]

Zstandard
Información general
Tipo de programa biblioteca de software
Licencia
  • licencia BSD de 3 cláusulas
  • GPLv2
Información técnica
Programado en C
Versiones
Última versión estable 1.5.720 de febrero de 2025
Enlaces
Sitio web oficial
Repositorio de código
zstd
github.com/facebook/zstd/blob/dev/doc/zstd compression format.md
Información general
Extensión de archivo .zst[1]
Tipo de MIME application/zstd[1]
Número mágico 28 b5 2f fd[1]
Tipo de formato compresor de archivos y algoritmo de compresión
Estándar(es) RFC 8878
Formato abierto ?

En 2018 el algoritmo se publicó como RFC 8478, que también define un tipo de medio asociado "application/zstd", extensión de nombre de archivo "zst" y codificación de contenido HTTP "zstd". [4]

Características

editar

Zstandard fue diseñado para ofrecer una relación de compresión comparable a la del algoritmo DEFLATE (desarrollado en 1991 y utilizado en los programas originales ZIP y gzip), 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]​ a 22 (la velocidad de compresión más lenta, pero la mejor relación de compresión).

A partir de la versión 1.3.2 (octubre de 2017), zstd implementa opcionalmente la 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 en menos del 20% entre los niveles más rápidos y más lentos.[7]​ La línea de comandos Zstandard tiene un modo "adaptativo" (--adapt) 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 de compresión máximo proporciona una relación de compresión cercana a lzma, lzham y ppmx, y rinde mejor que lza o bzip2.[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, como en el caso de los archivos de registro.

Diseño

editar

Zstandard combina una etapa de coincidencia de diccionario (

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).

Uso

editar

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.[15][16][17]

En 2017, Allan Jude integró Zstandard en el kernel de FreeBSD,[18]​ y posteriormente se integró como una opción de compresor para volcados de núcleo (tanto programas de usuario como 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.[19]

Las bases de datos AWS Redshift y RocksDB incluyen soporte para la compresión de campos mediante Zstandard.

En marzo de 2018, Canonical probó el uso de zstd como método de compresión de paquetes deb de forma predeterminada para la distribución Ubuntu Linux.[20]​ En comparación con la compresión xz de paquetes deb, zstd en el nivel 19 descomprime significativamente más rápido, pero al costo 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).[21][20][22]

Fedora agregó soporte ZStandard a RPM en mayo de 2018 (versión 28 de Fedora) y lo usó para empaquetar la versión en octubre de 2019 (versión 31 de Fedora). [23]​ En Fedora 33, el sistema de archivos está comprimido de forma predeterminada con zstd.[24][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 pquetes 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 un 50MiB cuando se utilizan varios subprocesos y la memoria de compresión aumenta, pero se escala con la cantidad de subprocesos utilizados.[27][28][29]​ Posteriormente, Arch Linux también cambió a zstd como el algoritmo de compresión predeterminado para el generador de disco RAM inicial mkinitcpio.[30]

Se utiliza una implementación completa del algoritmo con una opción para elegir el nivel de compresión .NSZ/.XCZ [31]​ desarrollados por la comunidad homebrew para la consola de juegos híbrida Nintendo Switch. [32]​ También es uno de los muchos algoritmos de compresión compatibles con el fprmato de archivo de imagen de disco RVZ para 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, desestimando el número de códec anterior 20 tal como se implementó en la versión 6.3.7, lanzada el 1 de junio.[33][34]

En marzo de 2024, la versión 123 de Google Chrome (y los navegadores basados en Chromium como Brave o Microsoft Edge) agregaron compatibilidad con zstd en el encabezado HTTP Content-Encoding.[35]​ En mayo de 2024, la versión 126.0 de Firefox agregó compatibilidad con zstd en el encabezado HTTP Content-Encoding.[36]

Licencia

editar

La implementación de referencia está licenciada bajo la licencia BSD, publicada en GitHub.[37]​ Desde la versión 1.0, contó con una concesión adicional de derechos de patente.[38]

A partir de la versión 1.3.1,[39]​ esta concesión de patente se abandonó y la licencia se cambió a una licencia dual BSD + GPLv2.[40]

Véase también

editar
  • LZ4 (algoritmo de compresión): un miembro rápido de la familia LZ77
  • LZFSE: un algoritmo similar de Apple utilizado desde iOS 9 y OS X 10.11 y que se convirtió en código abierto el 1 de junio de 2016
  • Zlib

Referencias

editar
  1. a b c Zstandard Compression and the application/zstd Media Type, doi:10.17487/RFC8878, RFC 8878 .
  2. Sergio De Simone (2 de septiembre de 2016). «Facebook Open-Sources New Compression Algorithm Outperforming Zlib». InfoQ. Consultado el 20 de abril de 2019. 
  3. «Life imitates satire: Facebook touts zlib killer just like Silicon Valley's Pied Piper». The Register. 31 de agosto de 2016. Consultado el 6 de septiembre de 2016. 
  4. Zstandard Compression and the application/zstd Media Type .
  5. «Release Zstandard v1.3.4 - faster everything · facebook/zstd». GitHub (en inglés). Consultado el 27 de marzo de 2024. 
  6. «Command Line Interface for Zstandard library». GitHub (en inglés). 28 de octubre de 2021. 
  7. a b «ZStandard in ZFS». open-zfs.org. 2017. Consultado el 20 de abril de 2019. 
  8. Matt Mahoney. «Silesia Open Source Compression Benchmark». Consultado el 10 de mayo de 2019. 
  9. Matt Mahoney (29 de agosto de 2016). «Large Text Compression Benchmark, .2157 zstd». Consultado el 1 de septiembre de 2016. 
  10. TurboBench: Static/Dynamic web content compression benchmark, PowTurbo .
  11. Matt Mahoney, Silesia Open Source Compression Benchmark .
  12. «Facebook developers report massive speedups and compression ratio improvements when using dictionaries» (PDF). Fermilab. 11 de octubre de 2017. Consultado el 27 de marzo de 2024. 
  13. «Smaller and faster data compression with Zstandard». Facebook. 31 de agosto de 2016. 
  14. «facebook/zstd». GitHub. 28 de octubre de 2021. 
  15. Corbet, Jonathan (17 de septiembre de 2017). «The rest of the 4.14 merge window [LWN.net]». lwn.net. Consultado el 27 de marzo de 2024. 
  16. «Linux_4.14 - Linux Kernel Newbies». Kernelnewbies.org. 30 de diciembre de 2017. Consultado el 16 de agosto de 2018. 
  17. Larabel, Michael (8 de septiembre de 2017). «Zstd Compression For Btrfs & Squashfs Set For Linux 4.14, Already Used Within Facebook - Phoronix». www.phoronix.com. 
  18. «Integrate ZSTD into the kernel · freebsd/Freebsd-SRC@28ef165». GitHub. 
  19. «Add ZSTD support to ZFS · openzfs/ZFS@10b3c7f». GitHub. 
  20. a b Larabel, Michael (12 de marzo de 2018). «Canonical Working On Zstd-Compressed Debian Packages For Ubuntu». phoronix.com. Phoronix Media. Consultado el 29 de octubre de 2019. «The developers at Canonical are considering a feature freeze exception to get this newly-developed Zstd Apt/Dpkg support in Ubuntu 18.04 LTS. In doing so, they mention they would be looking at enabling Zstd compression for packages by default in Ubuntu 18.10.» 
  21. «New Ubuntu Installs Could Be Speed Up by 10% with the Zstd Compression Algorithm». Softpedia. 12 de marzo de 2018. Consultado el 13 de agosto de 2018. 
  22. «Debian Changelog for apt». Debian (en inglés). 19 de abril de 2021. Consultado el 7 de noviembre de 2022. 
  23. «Changes/Switch RPMS to ZSTD compression». Fedora Project Wiki. 
  24. «Fedora Workstation 34 feature focus: Btrfs transparent compression». Fedora Magazine (en inglés estadounidense). 14 de abril de 2021. Consultado el 12 de mayo de 2022. 
  25. «Changes/BtrfsTransparentCompression». Fedora Project Wiki. Consultado el 12 de mayo de 2022. 
  26. Larabel, Michael (16 de octubre de 2019). «Arch Linux Nears Roll-Out of ZSTD Compressed Packages for Faster Pacman Installs». Phoronix. 
  27. Broda, Mara (4 de enero de 2020). «Now using Zstandard instead of xz for package compression». Arch Linux. Consultado el 5 de enero de 2020. 
  28. «RFC: (devtools) Changing default compression method to zstd», 2019-03-25, https://lists.archlinux.org/pipermail/arch-dev-public/2019-March/029542.html. 
  29. Broda, Mara (27 de diciembre de 2019). «makepkg.conf: change default compression method to zstd». GitHub. 
  30. Razzolini, Giancarlo (19 de febrero de 2021). «News: Moving to Zstandard images by default on mkinitcpio». Arch Linux. Consultado el 28 de diciembre de 2021. 
  31. «RELEASE - nsZip - NSP compressor/decompressor to reduce storage». GBAtemp.net - The Independent Video Game Community (en inglés estadounidense). 20 de octubre de 2019. Consultado el 3 de noviembre de 2019. 
  32. Bosshard, Nico (31 de octubre de 2019), nsZip is a tool to compress/decompress Nintendo Switch games using the here specified NSZ file format: nicoboss/nsZip, consultado el 3 de noviembre de 2019 .
  33. APPNOTE.TXT - .ZIP File Format Specification Version: 6.3.8, 15 de junio de 2020, consultado el 7 de julio de 2020 .
  34. APPNOTE.TXT - .ZIP File Format Specification Version: 6.3.7, 1 de junio de 2020, consultado el 6 de junio de 2020 .
  35. «New in Chrome 123 | Chrome Blog». Chrome for Developers (en inglés). 19 de marzo de 2024. Consultado el 16 de abril de 2024. 
  36. «Firefox 126.0, See All New Features, Updates and Fixes». Consultado el 15 de mayo de 2024. 
  37. «Facebook open sources Zstandard data compression algorithm, aims to replace technology behind Zip». ZDnet. 31 de agosto de 2016. Consultado el 1 de septiembre de 2016. 
  38. «zstd/PATENTS at v1.3.0 · facebook/zstd». GitHub (en inglés). Consultado el 27 de marzo de 2024. 
  39. «Release Zstandard v1.3.1 · facebook/zstd». GitHub (en inglés). Consultado el 27 de marzo de 2024. 
  40. «New license by Cyan4973 · Pull Request #801 · facebook/zstd». GitHub (en inglés). Consultado el 27 de marzo de 2024.