Zstandard , o zstd
como versión corta, es un algoritmo de compresión rápido sin pérdidas, dirigido a escenarios de compresión en tiempo real a nivel zlib y mejores relaciones de compresión. Está respaldado por una etapa de entropía muy rápida, proporcionada por Huff0 y la biblioteca FSE.
El formato de Zstandard es estable y está documentado en RFC8878. Ya hay disponibles múltiples implementaciones independientes. Este repositorio representa la implementación de referencia, proporcionada como una biblioteca C de código abierto con licencia dual BSD o GPLv2, y una utilidad de línea de comandos que produce y decodifica archivos .zst
, .gz
, .xz
y .lz4
. Si su proyecto requiere otro lenguaje de programación, se proporciona una lista de puertos y enlaces conocidos en la página de inicio de Zstandard.
Estado de la rama de desarrollo:
Como referencia, se probaron y compararon varios algoritmos de compresión rápida en una computadora de escritorio con una CPU Core i7-9700K a 4,9 GHz y con Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
), utilizando lzbench, un software en memoria de código abierto. punto de referencia de @inikep compilado con gcc 9.4.0, en el corpus de compresión de Silesia.
Nombre del compresor | Relación | Compresión | Descomprimir. |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510 MB/s | 1580MB/s |
zlib 1.2.11 -1 | 2.743 | 95 MB/s | 400 MB/s |
brotli 1.0.9 -0 | 2.702 | 395 MB/s | 430 MB/s |
zstd 1.5.6 --rápido = 1 | 2.437 | 545 MB/s | 1890MB/s |
zstd 1.5.6 --rápido = 3 | 2.239 | 650 MB/s | 2000MB/s |
Quicklz 1.5.0 -1 | 2.238 | 525 MB/s | 750 MB/s |
lzo1x 2.10 -1 | 2.106 | 650 MB/s | 825 MB/s |
lz4 1.9.4 | 2.101 | 700 MB/s | 4000MB/s |
lzf 3.6 -1 | 2.077 | 420 MB/s | 830 MB/s |
ágil 1.1.9 | 2.073 | 530 MB/s | 1660MB/s |
Los niveles de compresión negativos, especificados con --fast=#
, ofrecen una velocidad de compresión y descompresión más rápida a costa de la relación de compresión.
Zstd también puede ofrecer relaciones de compresión más fuertes a costa de la velocidad de compresión. La compensación entre velocidad y compresión se puede configurar en pequeños incrementos. La velocidad de descompresión se conserva y permanece aproximadamente igual en todas las configuraciones, una propiedad compartida por la mayoría de los algoritmos de compresión LZ, como zlib o lzma.
Las siguientes pruebas se ejecutaron en un servidor que ejecuta Linux Debian ( Linux version 4.14.0-3-amd64
) con una CPU Core i7-6700K a 4,0 GHz, utilizando lzbench, un punto de referencia en memoria de código abierto de @inikep compilado con gcc 7.3.0, en el corpus de compresión de Silesia.
Velocidad de compresión vs relación | Velocidad de descompresión |
---|---|
Algunos otros algoritmos pueden producir relaciones de compresión más altas a velocidades más lentas, quedando fuera del gráfico. Para obtener una imagen más grande, incluidos los modos lentos, haga clic en este enlace.
Los gráficos anteriores proporcionan resultados aplicables a escenarios típicos de archivos y transmisiones (varios MB). Los datos pequeños vienen con diferentes perspectivas.
Cuanto menor sea la cantidad de datos a comprimir, más difícil será comprimirlos. Este problema es común a todos los algoritmos de compresión y la razón es que los algoritmos de compresión aprenden de datos pasados cómo comprimir datos futuros. Pero al comienzo de un nuevo conjunto de datos, no hay un "pasado" sobre el cual construir.
Para resolver esta situación, Zstd ofrece un modo de entrenamiento , que se puede utilizar para ajustar el algoritmo para un tipo de datos seleccionado. El entrenamiento de Zstandard se logra proporcionándole algunas muestras (un archivo por muestra). El resultado de este entrenamiento se almacena en un archivo llamado "diccionario", que debe cargarse antes de la compresión y descompresión. Con este diccionario, la relación de compresión que se puede lograr en datos pequeños mejora drásticamente.
El siguiente ejemplo utiliza el conjunto de muestra github-users
, creado a partir de la API pública de github. Consta de aproximadamente 10.000 registros que pesan aproximadamente 1 KB cada uno.
Relación de compresión | Velocidad de compresión | Velocidad de descompresión |
---|---|---|
Estas ganancias de compresión se logran al mismo tiempo que se proporcionan velocidades de compresión y descompresión más rápidas .
El entrenamiento funciona si existe alguna correlación en una familia de pequeñas muestras de datos. Cuanto más específico sea un diccionario, más eficiente será (no existe un diccionario universal ). Por lo tanto, implementar un diccionario por tipo de datos proporcionará los mayores beneficios. Las ganancias del diccionario son más efectivas en los primeros KB. Luego, el algoritmo de compresión irá utilizando gradualmente contenido previamente decodificado para comprimir mejor el resto del archivo.
Crear el diccionario
zstd --train FullPathToTrainingSet/* -o dictionaryName
Comprimir con diccionario
zstd -D dictionaryName FILE
Descomprimir con diccionario
zstd -D dictionaryName --decompress FILE.zst
make
es el sistema de compilación mantenido oficialmente de este proyecto. Todos los demás sistemas de compilación son "compatibles" y mantenidos por terceros; pueden presentar pequeñas diferencias en las opciones avanzadas. Cuando su sistema lo permita, prefiera usar make
para compilar zstd
y libzstd
.
Si su sistema es compatible con make
estándar (o gmake
), invocar make
en el directorio raíz generará zstd
cli en el directorio raíz. También creará libzstd
en lib/
.
Otras opciones disponibles incluyen:
make install
: crea e instala zstd cli, biblioteca y páginas manmake check
: crear y ejecutar zstd
, probar su comportamiento en la plataforma local El Makefile
sigue las convenciones del Makefile estándar de GNU, lo que permite la instalación por etapas, indicadores estándar, variables de directorio y variables de comando.
Para casos de uso avanzado, los indicadores de compilación especializados que controlan la generación binaria están documentados en lib/README.md
para la biblioteca libzstd
y en programs/README.md
para la CLI zstd
.
Se proporciona un generador de proyectos cmake
dentro de build/cmake
. Puede generar Makefiles u otros scripts de compilación para crear bibliotecas binarias zstd
y bibliotecas dinámicas y estáticas libzstd
.
De forma predeterminada, CMAKE_BUILD_TYPE
está configurado en Release
.
zstd
se puede construir e instalar con soporte tanto para Apple Silicon (M1/M2) como para Intel utilizando el soporte Universal2 de CMake. Para realizar una compilación e instalación de Fat/Universal2, utilice los siguientes comandos:
cmake -B build-cmake-debug -S build/cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES= " x86_64;x86_64h;arm64 "
cd build-cmake-debug
ninja
sudo ninja install
Se proporciona un proyecto Meson dentro de build/meson
. Siga las instrucciones de compilación en ese directorio.
También puede consultar el archivo .travis.yml
para ver un ejemplo sobre cómo se utiliza Meson para construir este proyecto.
Tenga en cuenta que el tipo de compilación predeterminado es lanzamiento .
Puede compilar e instalar el administrador de dependencias zstd vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
Los miembros del equipo de Microsoft y los contribuyentes de la comunidad mantienen actualizado el puerto zstd en vcpkg. Si la versión no está actualizada, cree un problema o una solicitud de extracción en el repositorio de vcpkg.
Puede instalar binarios prediseñados para zstd o compilarlos desde el código fuente usando Conan. Utilice el siguiente comando:
conan install --requires= " zstd/[*] " --build=missing
Los mantenedores de Conan y los contribuyentes de la comunidad mantienen actualizada la receta de zstd Conan. Si la versión no está actualizada, cree una incidencia o una solicitud de extracción en el repositorio de ConanCenterIndex.
Al ingresar al directorio build
, encontrará posibilidades adicionales:
build/VS_scripts
, que compilarán la biblioteca zstd
cli y libzstd
sin necesidad de abrir la solución Visual Studio. Puede compilar el binario zstd a través de buck ejecutando: buck build programs:zstd
desde la raíz del repositorio. El binario de salida estará en buck-out/gen/programs/
.
Puede integrar fácilmente zstd en su proyecto Bazel utilizando el módulo alojado en el Repositorio Central de Bazel.
Puede ejecutar pruebas de humo locales rápidas ejecutando make check
. Si no puede usar make
, ejecute el script playTest.sh
desde el directorio src/tests
. Se necesitan dos variables de entorno $ZSTD_BIN
y $DATAGEN_BIN
para que el script de prueba ubique el binario zstd
y datagen
. Para obtener información sobre las pruebas de CI, consulte TESTING.md
.
Actualmente, Zstandard se implementa en Facebook y muchas otras grandes infraestructuras de nube. Se ejecuta continuamente para comprimir grandes cantidades de datos en múltiples formatos y casos de uso. Zstandard se considera seguro para entornos de producción.
Zstandard tiene doble licencia BSD o GPLv2.
La rama dev
es aquella en la que se fusionan todas las contribuciones antes de llegar release
. Si planea proponer un parche, comprométase con la rama dev
o su propia rama de funciones. No se permite el compromiso directo con release
. Para obtener más información, lea CONTRIBUIR.