Zstandard , ou zstd
como versão abreviada, é um algoritmo de compactação rápido e sem perdas, visando cenários de compactação em tempo real no nível zlib e melhores taxas de compactação. É apoiado por um estágio de entropia muito rápido, fornecido pela biblioteca Huff0 e FSE.
O formato do Zstandard é estável e documentado em RFC8878. Várias implementações independentes já estão disponíveis. Este repositório representa a implementação de referência, fornecida como uma biblioteca C dupla licenciada BSD OU GPLv2 de código aberto e um utilitário de linha de comando que produz e decodifica arquivos .zst
, .gz
, .xz
e .lz4
. Caso seu projeto exija outra linguagem de programação, uma lista de portas e ligações conhecidas é fornecida na página inicial do Zstandard.
Status da filial de desenvolvimento:
Para referência, vários algoritmos de compactação rápida foram testados e comparados em um desktop com CPU Core i7-9700K a 4,9 GHz e executando Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
), usando lzbench, um software de código aberto na memória benchmark de @inikep compilado com gcc 9.4.0, no corpus de compressão da Silésia.
Nome do compressor | Razão | Compressão | Descomprimir. |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510MB/s | 1580MB/s |
zlib 1.2.11 -1 | 2.743 | 95MB/s | 400MB/s |
brotli 1.0.9 -0 | 2.702 | 395MB/s | 430MB/s |
zstd 1.5.6 --rápido=1 | 2.437 | 545MB/s | 1890MB/s |
zstd 1.5.6 --rápido=3 | 2.239 | 650MB/s | 2.000 MB/s |
rápido 1.5.0 -1 | 2.238 | 525MB/s | 750MB/s |
lzo1x 2,10 -1 | 2.106 | 650MB/s | 825MB/s |
lz4 1.9.4 | 2.101 | 700MB/s | 4.000 MB/s |
lzf 3,6 -1 | 2.077 | 420MB/s | 830MB/s |
ágil 1.1.9 | 2.073 | 530MB/s | 1660MB/s |
Os níveis de compactação negativos, especificados com --fast=#
, oferecem compactação e descompactação mais rápidas ao custo da taxa de compactação.
O Zstd também pode oferecer taxas de compactação mais fortes ao custo da velocidade de compactação. A compensação entre velocidade e compressão é configurável em pequenos incrementos. A velocidade de descompressão é preservada e permanece praticamente a mesma em todas as configurações, uma propriedade compartilhada pela maioria dos algoritmos de compressão LZ, como zlib ou lzma.
Os testes a seguir foram executados em um servidor rodando Linux Debian ( Linux version 4.14.0-3-amd64
) com CPU Core i7-6700K a 4,0 GHz, usando lzbench, um benchmark de código aberto na memória de @inikep compilado com gcc 7.3.0, sobre o corpus de compressão da Silésia.
Velocidade de compressão vs relação | Velocidade de descompressão |
---|---|
Alguns outros algoritmos podem produzir taxas de compressão mais altas em velocidades mais lentas, ficando fora do gráfico. Para uma imagem maior, incluindo modos lentos, clique neste link.
Os gráficos anteriores fornecem resultados aplicáveis a cenários típicos de arquivos e fluxos (vários MB). Pequenos dados vêm com diferentes perspectivas.
Quanto menor a quantidade de dados a serem compactados, mais difícil será a compactação. Esse problema é comum a todos os algoritmos de compactação e o motivo é que os algoritmos de compactação aprendem com os dados passados como compactar dados futuros. Mas no início de um novo conjunto de dados, não existe um “passado” sobre o qual construir.
Para resolver esta situação, o Zstd oferece um modo de treinamento , que pode ser usado para ajustar o algoritmo para um tipo de dados selecionado. O treinamento do Zstandard é obtido fornecendo algumas amostras (um arquivo por amostra). O resultado deste treinamento é armazenado em um arquivo denominado “dicionário”, que deve ser carregado antes da compactação e descompactação. Usando este dicionário, a taxa de compactação alcançável em dados pequenos melhora drasticamente.
O exemplo a seguir usa o conjunto de amostras github-users
, criado a partir da API pública do github. Consiste em aproximadamente 10 mil registros pesando cerca de 1 KB cada.
Taxa de compressão | Velocidade de compressão | Velocidade de descompressão |
---|---|---|
Esses ganhos de compressão são alcançados ao mesmo tempo em que fornecem velocidades de compressão e descompressão mais rápidas .
O treinamento funciona se houver alguma correlação em uma família de pequenas amostras de dados. Quanto mais específico dos dados for um dicionário, mais eficiente ele será (não existe um dicionário universal ). Conseqüentemente, a implantação de um dicionário por tipo de dados proporcionará os maiores benefícios. Os ganhos de dicionário são mais efetivos nos primeiros KB. Em seguida, o algoritmo de compactação usará gradualmente o conteúdo previamente decodificado para compactar melhor o restante do arquivo.
Crie o dicionário
zstd --train FullPathToTrainingSet/* -o dictionaryName
Comprimir com dicionário
zstd -D dictionaryName FILE
Descompacte com dicionário
zstd -D dictionaryName --decompress FILE.zst
make
é o sistema de construção mantido oficialmente deste projeto. Todos os outros sistemas de construção são "compatíveis" e mantidos por terceiros, podendo apresentar pequenas diferenças nas opções avançadas. Quando seu sistema permitir, prefira usar make
para compilar zstd
e libzstd
.
Se o seu sistema for compatível com make
padrão (ou gmake
), invocar make
no diretório raiz gerará zstd
cli no diretório raiz. Ele também criará libzstd
em lib/
.
Outras opções disponíveis incluem:
make install
: crie e instale zstd cli, biblioteca e páginas de manualmake check
: crie e execute zstd
, teste seu comportamento na plataforma local O Makefile
segue as convenções do GNU Standard Makefile, permitindo instalação em etapas, sinalizadores padrão, variáveis de diretório e variáveis de comando.
Para casos de uso avançados, sinalizadores de compilação especializados que controlam a geração binária estão documentados em lib/README.md
para a biblioteca libzstd
e em programs/README.md
para a CLI zstd
.
Um gerador de projeto cmake
é fornecido em build/cmake
. Ele pode gerar Makefiles ou outros scripts de construção para criar binários zstd
e bibliotecas dinâmicas e estáticas libzstd
.
Por padrão, CMAKE_BUILD_TYPE
está definido como Release
.
zstd
pode ser construído e instalado com suporte para Apple Silicon (M1/M2) e Intel usando o suporte Universal2 do CMake. Para executar uma compilação e instalação do Fat/Universal2, use os seguintes 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
Um projeto Meson é fornecido em build/meson
. Siga as instruções de construção nesse diretório.
Você também pode dar uma olhada no arquivo .travis.yml
para obter um exemplo de como o Meson é usado para construir este projeto.
Observe que o tipo de compilação padrão é release .
Você pode construir e instalar o gerenciador de dependência zstd vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
A porta zstd no vcpkg é mantida atualizada pelos membros da equipe da Microsoft e colaboradores da comunidade. Se a versão estiver desatualizada, crie um problema ou solicitação pull no repositório vcpkg.
Você pode instalar binários pré-construídos para zstd ou construí-los a partir do código-fonte usando Conan. Use o seguinte comando:
conan install --requires= " zstd/[*] " --build=missing
A receita do zstd Conan é mantida atualizada pelos mantenedores do Conan e colaboradores da comunidade. Se a versão estiver desatualizada, crie um problema ou solicitação pull no repositório ConanCenterIndex.
Indo para o diretório build
, você encontrará possibilidades adicionais:
build/VS_scripts
, que construirá a biblioteca zstd
cli e libzstd
sem qualquer necessidade de abrir a solução Visual Studio. Você pode construir o binário zstd via buck executando: buck build programs:zstd
na raiz do repositório. O binário de saída estará em buck-out/gen/programs/
.
Você pode integrar facilmente o zstd ao seu projeto Bazel usando o módulo hospedado no Repositório Central do Bazel.
Você pode executar testes rápidos de fumaça locais executando make check
. Se você não puder usar make
, execute o script playTest.sh
do diretório src/tests
. Duas variáveis env $ZSTD_BIN
e $DATAGEN_BIN
são necessárias para que o script de teste localize o binário zstd
e datagen
. Para obter informações sobre testes de CI, consulte TESTING.md
.
O Zstandard está atualmente implantado no Facebook e em muitas outras grandes infraestruturas de nuvem. Ele é executado continuamente para compactar grandes quantidades de dados em vários formatos e casos de uso. Zstandard é considerado seguro para ambientes de produção.
Zstandard tem licença dupla sob BSD OU GPLv2.
O branch dev
é aquele onde todas as contribuições são mescladas antes de chegar release
. Se você planeja propor um patch, faça commit no branch dev
ou em seu próprio branch de recursos. A confirmação direta para release
não é permitida. Para obter mais informações, leia CONTRIBUINDO.