Golang 共通ライブラリ - pierrec/lz4 パッケージ | lz4 コマンド、lz4 圧縮アルゴリズム (解凍速度が高い)

Golang 共通ライブラリ - golang 共通ライブラリ - pierrec/lz4 パッケージ | lz4 圧縮アルゴリズム (解凍速度が高い)

LZ4 圧縮アルゴリズム

公式サイト:https://lz4.gi​​thub.io/lz4/

Yann Collet は、2011 年に LZ4 圧縮アルゴリズムを発明しました。

LZ4 は、コアあたり > 500 MB/秒 (> 0.15 バイト/サイクル) の圧縮速度を提供する可逆圧縮アルゴリズムです。コアあたり数 GB/秒 (~1 バイト/サイクル) の非常に高速なデコーダーを備えています。LZ4_HC と呼ばれる高圧縮の派生物が利用可能で、カスタマイズ可能な CPU 時間を圧縮率と交換します。LZ4 ライブラリは、BSD ライセンスの下でオープン ソース ソフトウェアとして提供されます。

lz4の利点
: 圧縮/解凍は非常に高速で、gzip よりも約 10 倍高速です。lz4 が一定の圧縮率を保証する場合、無敵の圧縮速度とより速い解凍速度で知られています。
デメリット:gzipに比べて汎用性がやや劣る

概要: lz4 は現在、最も効率的な圧縮アルゴリズムであり、圧縮と解凍の速度に重点を置いており、圧縮率が最初ではありません。

lz4 の公式 Web サイトでは、言語操作 lz4 へのリンクが提供されており、その中で go がGo Pierre Curto https://github.com/pierrec/lz4倉庫。

lz4 の使用シナリオ

lz4 は、「誰もが愛し、花が咲くのを見る」圧縮アルゴリズムであり、複数のコアで十分に拡張できます。lz4は圧縮率はやや劣りますが、解凍速度は驚くほど優れています(gzipの約3倍(複数回テスト比較))。圧縮時の効率的なマルチコアの利用と驚異的な解凍により、lz4 は多くの重要な場面で使用されてきました!頻繁な圧縮とリアルタイムの高速解凍が必要なシナリオでは、lz4 が非常に適しています ; lz4 によって解凍されるオブジェクトはファイルであり、ディレクトリではありません。

lz4 コマンド ツールのインストールと使用

yum install -y lz4 lz4-devel 
压缩 (默认解压之后的名称filename.lz4)
# lz4 filename       

解压缩
# lz4 -d filename.lz4

centos7下默认有lz4_decompress 命令,可以直接解压, 并可以定义解压后的文件名
# lz4_decompress filename.lz4 filename
# lz4_decompress filename.lz4 filename.txt

lz4 パラメータの説明

 lz4 --help

参数
-1:  快速压缩(默认)
-9:  高压缩
-d:  解压缩(默认为.lz4扩展名)
-z:  强制压缩
-f:  覆盖输出而不提示
-k:  保留源文件(默认)
--rm:  成功地解除/压缩后删除源文件
-h/-h:  显示帮助/长帮助和退出

高级参数
-v:  显示版本号并退出
-v:  详细模式
-q:  取消警告;指定两次也可以取消错误
-c:  强制写入标准输出,即使它是控制台
-t:  测试压缩文件完整性
-m:  多个输入文件(表示自动输出文件名)
-r:  在目录上递归操作(也设置为-m)
-l:  使用旧格式压缩(Linux内核压缩)

pierrec/lz4 パッケージ

github:https://github.com/pierrec/lz4/

このパッケージは、LZ4 データ ストリームへのストリーミング インターフェイスと、LZ4 データ ブロックの低レベルの圧縮および解凍関数を提供します. 実装は、リファレンス C に基づいています. このパッケージは、LZ4 データ ストリームへのストリーミング インターフェイスを提供します
, および LZ4 データ ブロック基礎となる圧縮および解凍機能。実装は参照 C に基づいています。

コードのデモ

公式デモ: バイトコードの読み取りと解凍

package lz4_test

import (
	"fmt"
	"io"
	"os"
	"strings"

	"github.com/pierrec/lz4/v4"
)

func Example() {
    
    
	// Compress and uncompress an input string.
	s := "hello world"
	r := strings.NewReader(s)

	// The pipe will uncompress the data from the writer.
	pr, pw := io.Pipe()
	zw := lz4.NewWriter(pw)
	zr := lz4.NewReader(pr)

	go func() {
    
    
		// Compress the input string.
		_, _ = io.Copy(zw, r)
		_ = zw.Close() // Make sure the writer is closed
		_ = pw.Close() // Terminate the pipe
	}()

	_, _ = io.Copy(os.Stdout, zr)

	// Output:
	// hello world
}

func ExampleCompressBlock() {
    
    
	s := "hello world"
	data := []byte(strings.Repeat(s, 100))
	buf := make([]byte, lz4.CompressBlockBound(len(data)))

	var c lz4.Compressor
	n, err := c.CompressBlock(data, buf)
	if err != nil {
    
    
		fmt.Println(err)
	}
	if n >= len(data) {
    
    
		fmt.Printf("`%s` is not compressible", s)
	}
	buf = buf[:n] // compressed data

	// Allocate a very large buffer for decompression.
	out := make([]byte, 10*len(data))
	n, err = lz4.UncompressBlock(buf, out)
	if err != nil {
    
    
		fmt.Println(err)
	}
	out = out[:n] // uncompressed data

	fmt.Println(string(out[:len(s)]))

	// Output:
	// hello world
}

概要: Golang は lz4 圧縮バイトを解凍し、コアは公式の UncompressBlock 関数を使用することです。

UncompressBlock は、ソース バッファをデスティネーション バッファに解凍し、圧縮されていないサイズを返します。デスティネーション バッファのサイズは適切でなければなりません。ソース データが無効であるか、宛先バッファーが小さすぎる場合は、エラーを返します。
lz4 圧縮データではないバイト データを使用すると、解凍時にエラーが発生します。 lz4errors.Error=lz4: invalid source or destination buffer too short

// UncompressBlock uncompresses the source buffer into the destination one,
// and returns the uncompressed size.
//
// The destination buffer must be sized appropriately.
//
// An error is returned if the source data is invalid or the destination buffer is too small.
func UncompressBlock(src, dst []byte) (int, error) {
    
    
	return lz4block.UncompressBlock(src, dst, nil)
}

参照する

速度と圧縮率はどうですか?構築と展開における圧縮アルゴリズムの最適化
参照 URL: https://tech.meituan.com/2021/01/07/pack-gzip-zstd-lz4.html
Speed King — LZ4 圧縮アルゴリズム (1)
参照 URL: https ://www.cnblogs.com/aiwz/p/6333317.html

おすすめ

転載: blog.csdn.net/inthat/article/details/127151802