Zstandard , ou zstd
en version courte, est un algorithme de compression rapide sans perte, ciblant des scénarios de compression en temps réel au niveau zlib et de meilleurs taux de compression. Il est soutenu par un étage d'entropie très rapide, fourni par la bibliothèque Huff0 et FSE.
Le format de Zstandard est stable et documenté dans la RFC8878. Plusieurs implémentations indépendantes sont déjà disponibles. Ce référentiel représente l'implémentation de référence, fournie sous la forme d'une bibliothèque C open source double sous licence BSD OU GPLv2, et d'un utilitaire de ligne de commande produisant et décodant les fichiers .zst
, .gz
, .xz
et .lz4
. Si votre projet nécessite un autre langage de programmation, une liste des ports et liaisons connus est fournie sur la page d'accueil de Zstandard.
Statut de la branche de développement :
Pour référence, plusieurs algorithmes de compression rapides ont été testés et comparés sur un ordinateur de bureau doté d'un processeur Core i7-9700K à 4,9 GHz et exécutant Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
), à l'aide de lzbench, un logiciel open source en mémoire. benchmark par @inikep compilé avec gcc 9.4.0, sur le corpus de compression Silesia.
Nom du compresseur | Rapport | Compression | Décompresser. |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510 Mo/s | 1580 Mo/s |
zlib 1.2.11 -1 | 2.743 | 95 Mo/s | 400 Mo/s |
brotli 1.0.9 -0 | 2.702 | 395 Mo/s | 430 Mo/s |
zstd 1.5.6 --fast=1 | 2.437 | 545 Mo/s | 1890 Mo/s |
zstd 1.5.6 --fast=3 | 2.239 | 650 Mo/s | 2000 Mo/s |
quicklz 1.5.0 -1 | 2.238 | 525 Mo/s | 750 Mo/s |
lzo1x 2.10 -1 | 2.106 | 650 Mo/s | 825 Mo/s |
lz4 1.9.4 | 2.101 | 700 Mo/s | 4000 Mo/s |
lzf 3,6 -1 | 2.077 | 420 Mo/s | 830 Mo/s |
vif 1.1.9 | 2.073 | 530 Mo/s | 1660 Mo/s |
Les niveaux de compression négatifs, spécifiés avec --fast=#
, offrent une vitesse de compression et de décompression plus rapide au détriment du taux de compression.
Zstd peut également offrir des taux de compression plus élevés au détriment de la vitesse de compression. Le compromis vitesse/compression est configurable par petits incréments. La vitesse de décompression est préservée et reste à peu près la même quel que soit le paramètre, une propriété partagée par la plupart des algorithmes de compression LZ, tels que zlib ou lzma.
Les tests suivants ont été exécutés sur un serveur exécutant Linux Debian ( Linux version 4.14.0-3-amd64
) avec un processeur Core i7-6700K à 4,0 GHz, en utilisant lzbench, un benchmark open source en mémoire par @inikep compilé avec gcc. 7.3.0, sur le corpus de compression Silesia.
Vitesse de compression vs rapport | Vitesse de décompression |
---|---|
Quelques autres algorithmes peuvent produire des taux de compression plus élevés à des vitesses plus lentes, sortant ainsi du graphique. Pour une image plus grande incluant les modes lents, cliquez sur ce lien.
Les graphiques précédents fournissent des résultats applicables à des scénarios typiques de fichiers et de flux (plusieurs Mo). Les petites données présentent différentes perspectives.
Plus la quantité de données à compresser est petite, plus elle est difficile à compresser. Ce problème est commun à tous les algorithmes de compression, et la raison en est que les algorithmes de compression apprennent à partir des données passées comment compresser les données futures. Mais au début d’un nouvel ensemble de données, il n’y a pas de « passé » sur lequel s’appuyer.
Pour résoudre cette situation, Zstd propose un mode d'entraînement , qui peut être utilisé pour affiner l'algorithme pour un type de données sélectionné. La formation de Zstandard est réalisée en lui fournissant quelques échantillons (un fichier par échantillon). Le résultat de cet apprentissage est stocké dans un fichier appelé « dictionnaire », qui doit être chargé avant compression et décompression. Grâce à ce dictionnaire, le taux de compression réalisable sur de petites données s'améliore considérablement.
L'exemple suivant utilise l'ensemble d'exemples github-users
, créé à partir de l'API publique github. Il se compose d’environ 10 000 enregistrements pesant environ 1 Ko chacun.
Taux de compression | Vitesse de compression | Vitesse de décompression |
---|---|---|
Ces gains de compression sont obtenus tout en offrant simultanément des vitesses de compression et de décompression plus rapides .
La formation fonctionne s'il existe une certaine corrélation dans une famille de petits échantillons de données. Plus un dictionnaire est spécifique aux données, plus il est efficace (il n’existe pas de dictionnaire universel ). Par conséquent, le déploiement d’un dictionnaire par type de données offrira les plus grands avantages. Les gains de dictionnaire sont principalement efficaces dans les premiers Ko. Ensuite, l’algorithme de compression va progressivement utiliser le contenu préalablement décodé pour mieux compresser le reste du fichier.
Créer le dictionnaire
zstd --train FullPathToTrainingSet/* -o dictionaryName
Compresser avec un dictionnaire
zstd -D dictionaryName FILE
Décompresser avec le dictionnaire
zstd -D dictionaryName --decompress FILE.zst
make
est le système de construction officiellement maintenu de ce projet. Tous les autres systèmes de construction sont « compatibles » et entretenus par des tiers, ils peuvent présenter de petites différences dans les options avancées. Lorsque votre système le permet, préférez utiliser make
pour construire zstd
et libzstd
.
Si votre système est compatible avec make
standard (ou gmake
), l'appel de make
dans le répertoire racine générera zstd
cli dans le répertoire racine. Cela créera également libzstd
dans lib/
.
Les autres options disponibles incluent :
make install
: créer et installer zstd cli, bibliothèque et pages de manuelmake check
: créez et exécutez zstd
, testez son comportement sur la plateforme locale Le Makefile
suit les conventions Makefile standard GNU, autorisant une installation par étapes, des indicateurs standard, des variables de répertoire et des variables de commande.
Pour les cas d'utilisation avancés, les indicateurs de compilation spécialisés qui contrôlent la génération binaire sont documentés dans lib/README.md
pour la bibliothèque libzstd
et dans programs/README.md
pour la CLI zstd
.
Un générateur de projet cmake
est fourni dans build/cmake
. Il peut générer des Makefiles ou d'autres scripts de construction pour créer des bibliothèques binaires zstd
et libzstd
dynamiques et statiques.
Par défaut, CMAKE_BUILD_TYPE
est défini sur Release
.
zstd
peut être construit et installé avec la prise en charge d'Apple Silicon (M1/M2) ainsi que d'Intel en utilisant la prise en charge Universal2 de CMake. Pour effectuer une compilation et une installation Fat/Universal2, utilisez les commandes suivantes :
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
Un projet Meson est fourni dans build/meson
. Suivez les instructions de construction dans ce répertoire.
Vous pouvez également consulter le fichier .travis.yml
pour un exemple de la façon dont Meson est utilisé pour construire ce projet.
Notez que le type de build par défaut est release .
Vous pouvez créer et installer le gestionnaire de dépendances zstd vcpkg :
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
Le port zstd dans vcpkg est tenu à jour par les membres de l'équipe Microsoft et les contributeurs de la communauté. Si la version est obsolète, veuillez créer un problème ou une pull request sur le référentiel vcpkg.
Vous pouvez installer des binaires prédéfinis pour zstd ou les créer à partir des sources à l'aide de Conan. Utilisez la commande suivante :
conan install --requires= " zstd/[*] " --build=missing
La recette zstd Conan est tenue à jour par les responsables de Conan et les contributeurs de la communauté. Si la version est obsolète, veuillez créer un problème ou une pull request sur le référentiel ConanCenterIndex.
En allant dans le répertoire build
, vous trouverez des possibilités supplémentaires :
build/VS_scripts
, qui construiront la bibliothèque zstd
cli et libzstd
sans avoir besoin d'ouvrir la solution Visual Studio. Vous pouvez créer le binaire zstd via buck en exécutant : buck build programs:zstd
à partir de la racine du dépôt. Le binaire de sortie sera dans buck-out/gen/programs/
.
Vous pouvez facilement intégrer zstd dans votre projet Bazel en utilisant le module hébergé sur le référentiel central Bazel.
Vous pouvez exécuter des tests de fumée locaux rapides en exécutant make check
. Si vous ne pouvez pas utiliser make
, exécutez le script playTest.sh
à partir du répertoire src/tests
. Deux variables d'environnement $ZSTD_BIN
et $DATAGEN_BIN
sont nécessaires au script de test pour localiser les binaires zstd
et datagen
. Pour plus d'informations sur les tests CI, veuillez vous référer à TESTING.md
.
Zstandard est actuellement déployé au sein de Facebook et de nombreuses autres grandes infrastructures cloud. Il est exécuté en continu pour compresser de grandes quantités de données dans plusieurs formats et cas d'utilisation. Zstandard est considéré comme sûr pour les environnements de production.
Zstandard est sous double licence sous BSD OU GPLv2.
La branche dev
est celle où toutes les contributions sont fusionnées avant d'atteindre release
. Si vous envisagez de proposer un correctif, veuillez vous engager dans la branche dev
ou dans sa propre branche de fonctionnalités. L'engagement direct de release
n'est pas autorisé. Pour plus d’informations, veuillez lire CONTRIBUER.