2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

  • 早 12 月、今年は Advent Calendar に参加することができ嬉しく思います。
    • 今回の参加テーマは CLI。中年は CLI が大好きな生き物です(偏見)

Prologue

日頃の圧縮行動

  • 話は変わりますが、日常で圧縮/解凍を行うのはこんなシーンではないでしょうか。

稼働サービスの蓄積データやログの圧縮に

  • logrotate でも行われる一般的な使途ですが、
    横着して以下のようなことはよくやります。

     $ SVC=my_service.py DATE=$(date +%Y-%m-%d) LOG=_log/${DATE}_${SVC%.*}.txt
     $ nohup python3 my_service.py > $LOG 2>&1 &
    
     $ gzip _log/*.txt
    
    • データやログが巨大なサービスでは、これだけで
      ストレージの領域が大きく空くので、意外と重要です。

簡易的なバージョン管理に

  • git は大好きですが、「まだ git を使う時ではないな」という時に

     $ gzip -k hello.txt
    
     (hello.txt を編集中...)
    
     $ FILE=hello.txt; zdiff -NEwur ${FILE}.gz $FILE
     (変更差分が表示される)
    
    • gz は古いファイル、xz は新しい(変更検討中の)ファイル
      というマイルールを設けて利用しています。
    • 特に、/etc/ の中のファイルを変更する際によくやります。

zstd の性能比較

  • 話は zstd に戻りますが、既に様々な Linux 環境に浸透していました。
    :o: : プリインストールされている
    :x: : プリインストールはされていないが apt install すれば使える
    • :o: Ubuntu
    • :o: Debian
    • :o: Raspberry Pi OS
    • :o: Termux (Android)
    • :x: Armbian
    • :x: DietPi
       
  • zstd は(冒頭の記事にもある通り)、以下の特徴があります。
    1. gzip よりも圧縮率が高く
    2. gzip よりも高速に処理できる
       
  • 宣伝に偽り無いかどうか、簡単ではありますが私の手元でも確認してみました。
    • 検証環境 : Ubuntu 24.04
    • 検証対象 : ASCII text
      • /var/log/ にあった syslog や auth.log を適当に集めて利用しました。

圧縮率比較

  • xz は、さすがの圧縮率です。

    type size pct.
    plain 19 MB 100 %
    gzip 3.0 MB 15.8 %
    gstd 2.7 MB 14.2 %
    xz 1.6 MB 8.4 %

処理速度比較

  • 圧縮

    type value
    gzip 0.714 s
    gstd 0.205 s
    xz 9.250 s
    • xz は並列化オプションは使っていません。
       
  • 解凍

    type value
    gzip 0.193 s
    gstd 0.095 s
    xz 0.252 s
    • いずれも優秀ですが、量や実行回数が多い場合には考慮する必要がありそうです。

付記

zstd の使い方

  • 前章から、「zstd は使うべき」ということで話を進めたいと思います。

zstd は基本的には gzip や xz と同じように使える

  • 基本的な使い方は同じです。拡張子は .zst です。
    1. hello.txt を圧縮する

      $ zstd hello.txt
      

       

    2. hello.txt.zst を解凍する

      $ unzstd hello.txt.zst
      

完全な互換動作ではない

  • option 指定なしの場合、zstd は「元のファイルを残す」が既定の動作になります。

     $ zstd hello.txt
    
     $ ls -1 hello.txt*
     hello.txt
     hello.txt.zst
    
    • gzip と xz は「元のファイルを残さない」が既定なので、
      単純に gzip や xz を zstd コマンドに差し替えるだけでは
      ストレージ容量も削減されません。
       
  • このようになった経緯は GitHub の issue に記載されていました

    • 「辞書圧縮」という仕様を考慮してのことだそうです(詳しくはよく知りません)。

敢えて互換動作させたい場合

  • 前項の issue の末尾のコメントにも記載がありますが、「alias を使え」とのこと
    なので、(bash をご利用の場合は)~/.bashrc の alias 定義集の下に
    以下を追記しておけば、既定の動作が「元ファイル削除」になります。

     alias zstd='zstd --rm'
     alias unzstd='unzstd --rm'
    
    • issue のコメントにも「既定仕様の -k とぶつかるが、後勝ち (last one wins)」
      とあるので、一応これで問題無いのだろうと思います。

Epilogue

  • さて、これで心置きなく zstd を使えるぞ!と思いきや、

     $ FILE=hello.txt; zdiff -NEwur ${FILE}.gz $FILE
     (変更差分が表示される)
    
    • 残念ながら、zstd には gzip のこの zdiff に相当する
      zstddiff のようなコマンドは用意されていません。
      • これについては、長くなったのでまた次の機会に書きたいと思います。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?