• Home
Name Date Size #Lines LOC

..--

.github/04-Jul-2025-1,4861,267

build/04-Jul-2025-11,13210,050

contrib/04-Jul-2025-16,44111,969

doc/04-Jul-2025-6,8764,959

examples/04-Jul-2025-1,565944

lib/04-Jul-2025-81,09151,637

programs/04-Jul-2025-14,23810,586

tests/04-Jul-2025-34,50526,700

zlibWrapper/04-Jul-2025-7,1285,123

.buckconfigD04-Jul-2025407 108

.buckversionD04-Jul-202541 21

.cirrus.ymlD04-Jul-2025214 109

.gitattributesD04-Jul-2025348 2217

.gitignoreD04-Jul-2025592 6456

Android.bpD04-Jul-20256.3 KiB259242

CHANGELOGD04-Jul-202550.2 KiB864796

CODE_OF_CONDUCT.mdD04-Jul-2025244 64

CONTRIBUTING.mdD04-Jul-202530.1 KiB490431

COPYINGD04-Jul-202517.7 KiB339281

LICENSED04-Jul-20251.5 KiB3123

METADATAD04-Jul-2025573 2119

MODULE_LICENSE_BSDD04-Jul-20250

MakefileD04-Jul-202516.2 KiB472330

OWNERSD04-Jul-202546 21

Package.swiftD04-Jul-20251.2 KiB3727

README.mdD04-Jul-202511.2 KiB238166

SECURITY.mdD04-Jul-2025952 168

TESTING.mdD04-Jul-20251.8 KiB4439

README.md

1<p align="center"><img src="https://raw.githubusercontent.com/facebook/zstd/dev/doc/images/zstd_logo86.png" alt="Zstandard"></p>
2
3__Zstandard__, or `zstd` as short version, is a fast lossless compression algorithm,
4targeting real-time compression scenarios at zlib-level and better compression ratios.
5It's backed by a very fast entropy stage, provided by [Huff0 and FSE library](https://github.com/Cyan4973/FiniteStateEntropy).
6
7Zstandard's format is stable and documented in [RFC8878](https://datatracker.ietf.org/doc/html/rfc8878). Multiple independent implementations are already available.
8This repository represents the reference implementation, provided as an open-source dual [BSD](LICENSE) OR [GPLv2](COPYING) licensed **C** library,
9and a command line utility producing and decoding `.zst`, `.gz`, `.xz` and `.lz4` files.
10Should your project require another programming language,
11a list of known ports and bindings is provided on [Zstandard homepage](https://facebook.github.io/zstd/#other-languages).
12
13**Development branch status:**
14
15[![Build Status][travisDevBadge]][travisLink]
16[![Build status][CircleDevBadge]][CircleLink]
17[![Build status][CirrusDevBadge]][CirrusLink]
18[![Fuzzing Status][OSSFuzzBadge]][OSSFuzzLink]
19
20[travisDevBadge]: https://api.travis-ci.com/facebook/zstd.svg?branch=dev "Continuous Integration test suite"
21[travisLink]: https://travis-ci.com/facebook/zstd
22[CircleDevBadge]: https://circleci.com/gh/facebook/zstd/tree/dev.svg?style=shield "Short test suite"
23[CircleLink]: https://circleci.com/gh/facebook/zstd
24[CirrusDevBadge]: https://api.cirrus-ci.com/github/facebook/zstd.svg?branch=dev
25[CirrusLink]: https://cirrus-ci.com/github/facebook/zstd
26[OSSFuzzBadge]: https://oss-fuzz-build-logs.storage.googleapis.com/badges/zstd.svg
27[OSSFuzzLink]: https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:zstd
28
29## Benchmarks
30
31For reference, several fast compression algorithms were tested and compared
32on a desktop featuring a Core i7-9700K CPU @ 4.9GHz
33and running Ubuntu 20.04 (`Linux ubu20 5.15.0-101-generic`),
34using [lzbench], an open-source in-memory benchmark by @inikep
35compiled with [gcc] 9.4.0,
36on the [Silesia compression corpus].
37
38[lzbench]: https://github.com/inikep/lzbench
39[Silesia compression corpus]: https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia
40[gcc]: https://gcc.gnu.org/
41
42| Compressor name         | Ratio | Compression| Decompress.|
43| ---------------         | ------| -----------| ---------- |
44| **zstd 1.5.6 -1**       | 2.887 |   510 MB/s |  1580 MB/s |
45| [zlib] 1.2.11 -1        | 2.743 |    95 MB/s |   400 MB/s |
46| brotli 1.0.9 -0         | 2.702 |   395 MB/s |   430 MB/s |
47| **zstd 1.5.6 --fast=1** | 2.437 |   545 MB/s |  1890 MB/s |
48| **zstd 1.5.6 --fast=3** | 2.239 |   650 MB/s |  2000 MB/s |
49| quicklz 1.5.0 -1        | 2.238 |   525 MB/s |   750 MB/s |
50| lzo1x 2.10 -1           | 2.106 |   650 MB/s |   825 MB/s |
51| [lz4] 1.9.4             | 2.101 |   700 MB/s |  4000 MB/s |
52| lzf 3.6 -1              | 2.077 |   420 MB/s |   830 MB/s |
53| snappy 1.1.9            | 2.073 |   530 MB/s |  1660 MB/s |
54
55[zlib]: https://www.zlib.net/
56[lz4]: https://lz4.github.io/lz4/
57
58The negative compression levels, specified with `--fast=#`,
59offer faster compression and decompression speed
60at the cost of compression ratio.
61
62Zstd can also offer stronger compression ratios at the cost of compression speed.
63Speed vs Compression trade-off is configurable by small increments.
64Decompression speed is preserved and remains roughly the same at all settings,
65a property shared by most LZ compression algorithms, such as [zlib] or lzma.
66
67The following tests were run
68on a server running Linux Debian (`Linux version 4.14.0-3-amd64`)
69with a Core i7-6700K CPU @ 4.0GHz,
70using [lzbench], an open-source in-memory benchmark by @inikep
71compiled with [gcc] 7.3.0,
72on the [Silesia compression corpus].
73
74Compression Speed vs Ratio | Decompression Speed
75---------------------------|--------------------
76![Compression Speed vs Ratio](doc/images/CSpeed2.png "Compression Speed vs Ratio") | ![Decompression Speed](doc/images/DSpeed3.png "Decompression Speed")
77
78A few other algorithms can produce higher compression ratios at slower speeds, falling outside of the graph.
79For a larger picture including slow modes, [click on this link](doc/images/DCspeed5.png).
80
81
82## The case for Small Data compression
83
84Previous charts provide results applicable to typical file and stream scenarios (several MB). Small data comes with different perspectives.
85
86The smaller the amount of data to compress, the more difficult it is to compress. This problem is common to all compression algorithms, and reason is, compression algorithms learn from past data how to compress future data. But at the beginning of a new data set, there is no "past" to build upon.
87
88To solve this situation, Zstd offers a __training mode__, which can be used to tune the algorithm for a selected type of data.
89Training Zstandard is achieved by providing it with a few samples (one file per sample). The result of this training is stored in a file called "dictionary", which must be loaded before compression and decompression.
90Using this dictionary, the compression ratio achievable on small data improves dramatically.
91
92The following example uses the `github-users` [sample set](https://github.com/facebook/zstd/releases/tag/v1.1.3), created from [github public API](https://developer.github.com/v3/users/#get-all-users).
93It consists of roughly 10K records weighing about 1KB each.
94
95Compression Ratio | Compression Speed | Decompression Speed
96------------------|-------------------|--------------------
97![Compression Ratio](doc/images/dict-cr.png "Compression Ratio") | ![Compression Speed](doc/images/dict-cs.png "Compression Speed") | ![Decompression Speed](doc/images/dict-ds.png "Decompression Speed")
98
99
100These compression gains are achieved while simultaneously providing _faster_ compression and decompression speeds.
101
102Training works if there is some correlation in a family of small data samples. The more data-specific a dictionary is, the more efficient it is (there is no _universal dictionary_).
103Hence, deploying one dictionary per type of data will provide the greatest benefits.
104Dictionary gains are mostly effective in the first few KB. Then, the compression algorithm will gradually use previously decoded content to better compress the rest of the file.
105
106### Dictionary compression How To:
107
1081. Create the dictionary
109
110   `zstd --train FullPathToTrainingSet/* -o dictionaryName`
111
1122. Compress with dictionary
113
114   `zstd -D dictionaryName FILE`
115
1163. Decompress with dictionary
117
118   `zstd -D dictionaryName --decompress FILE.zst`
119
120
121## Build instructions
122
123`make` is the officially maintained build system of this project.
124All other build systems are "compatible" and 3rd-party maintained,
125they may feature small differences in advanced options.
126When your system allows it, prefer using `make` to build `zstd` and `libzstd`.
127
128### Makefile
129
130If your system is compatible with standard `make` (or `gmake`),
131invoking `make` in root directory will generate `zstd` cli in root directory.
132It will also create `libzstd` into `lib/`.
133
134Other available options include:
135- `make install` : create and install zstd cli, library and man pages
136- `make check` : create and run `zstd`, test its behavior on local platform
137
138The `Makefile` follows the [GNU Standard Makefile conventions](https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html),
139allowing staged install, standard flags, directory variables and command variables.
140
141For advanced use cases, specialized compilation flags which control binary generation
142are documented in [`lib/README.md`](lib/README.md#modular-build) for the `libzstd` library
143and in [`programs/README.md`](programs/README.md#compilation-variables) for the `zstd` CLI.
144
145### cmake
146
147A `cmake` project generator is provided within `build/cmake`.
148It can generate Makefiles or other build scripts
149to create `zstd` binary, and `libzstd` dynamic and static libraries.
150
151By default, `CMAKE_BUILD_TYPE` is set to `Release`.
152
153#### Support for Fat (Universal2) Output
154
155`zstd` can be built and installed with support for both Apple Silicon (M1/M2) as well as Intel by using CMake's Universal2 support.
156To perform a Fat/Universal2 build and install use the following commands:
157
158```bash
159cmake -B build-cmake-debug -S build/cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES="x86_64;x86_64h;arm64"
160cd build-cmake-debug
161ninja
162sudo ninja install
163```
164
165### Meson
166
167A Meson project is provided within [`build/meson`](build/meson). Follow
168build instructions in that directory.
169
170You can also take a look at [`.travis.yml`](.travis.yml) file for an
171example about how Meson is used to build this project.
172
173Note that default build type is **release**.
174
175### VCPKG
176You can build and install zstd [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager:
177
178    git clone https://github.com/Microsoft/vcpkg.git
179    cd vcpkg
180    ./bootstrap-vcpkg.sh
181    ./vcpkg integrate install
182    ./vcpkg install zstd
183
184The zstd port in vcpkg is kept up to date by Microsoft team members and community contributors.
185If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
186
187### Conan
188
189You can install pre-built binaries for zstd or build it from source using [Conan](https://conan.io/). Use the following command:
190
191```bash
192conan install --requires="zstd/[*]" --build=missing
193```
194
195The zstd Conan recipe is kept up to date by Conan maintainers and community contributors.
196If the version is out of date, please [create an issue or pull request](https://github.com/conan-io/conan-center-index) on the ConanCenterIndex repository.
197
198### Visual Studio (Windows)
199
200Going into `build` directory, you will find additional possibilities:
201- Projects for Visual Studio 2005, 2008 and 2010.
202  + VS2010 project is compatible with VS2012, VS2013, VS2015 and VS2017.
203- Automated build scripts for Visual compiler by [@KrzysFR](https://github.com/KrzysFR), in `build/VS_scripts`,
204  which will build `zstd` cli and `libzstd` library without any need to open Visual Studio solution.
205
206### Buck
207
208You can build the zstd binary via buck by executing: `buck build programs:zstd` from the root of the repo.
209The output binary will be in `buck-out/gen/programs/`.
210
211### Bazel
212
213You easily can integrate zstd into your Bazel project by using the module hosted on the [Bazel Central Repository](https://registry.bazel.build/modules/zstd).
214
215## Testing
216
217You can run quick local smoke tests by running `make check`.
218If you can't use `make`, execute the `playTest.sh` script from the `src/tests` directory.
219Two env variables `$ZSTD_BIN` and `$DATAGEN_BIN` are needed for the test script to locate the `zstd` and `datagen` binary.
220For information on CI testing, please refer to `TESTING.md`.
221
222## Status
223
224Zstandard is currently deployed within Facebook and many other large cloud infrastructures.
225It is run continuously to compress large amounts of data in multiple formats and use cases.
226Zstandard is considered safe for production environments.
227
228## License
229
230Zstandard is dual-licensed under [BSD](LICENSE) OR [GPLv2](COPYING).
231
232## Contributing
233
234The `dev` branch is the one where all contributions are merged before reaching `release`.
235If you plan to propose a patch, please commit into the `dev` branch, or its own feature branch.
236Direct commit to `release` are not permitted.
237For more information, please read [CONTRIBUTING](CONTRIBUTING.md).
238