Zstandard(zst)とは?Facebookの圧縮アルゴリズムを解説
Zstandardの概要:実際のところ何なのか?
Zstandardは、しばしば「zstd」(ファイル拡張子は.zst)と略され、Facebook(現Meta)のヤン・コレット氏によって開発された可逆データ圧縮アルゴリズムです。2016年にオープンソースとして公開されるとすぐに定着し、Linuxカーネルはバージョン5.16でこれを採用しました。Facebook自体も、その巨大なインフラ全体でzstdに依存しており、データベースのスナップショットからログファイルまで、あらゆるものを圧縮しています。この形式は現在、RFC 8878に完全に文書化された公式のインターネット標準となっています。 内部的には、zstdは辞書ベースのLZ77アプローチと、非対称数値システム(ANS)と呼ばれる最新のエントロピーコーダーを組み合わせています。実用的な観点から見ると、これは、より遅く、より伝統的なアルゴリズムと比較して、圧縮率をほとんど犠牲にすることなく、驚異的な速度でデータを圧縮および解凍できることを意味します。 .zst拡張子は、シングルストリームの圧縮形式を示します。また、おなじみの.tar.gzや.tar.bz2と同じように、zstdで圧縮されたtarアーカイブである.tar.zstもよく見かけるでしょう。最近Linuxパッケージ、データベースバックアップ、または大規模なデータセットをダウンロードしたなら、それが.zstまたは.tar.zstファイルであった可能性が高いです。
Zstandardとgzip、bzip2、xzの比較
圧縮ツールを選ぶ際、常に3つの要素のバランスを取ることになります。それは、出力サイズ(圧縮率)、圧縮速度、そして解凍速度です。Zstandardは、定評のあるgzipをこれら3つの面すべてで同時に凌駕するようにゼロから設計されました。これは信じられないほど聞こえるかもしれませんが、おおむね事実です。 標準的なテストスイートであるSilesiaコーパスにおけるFacebook自身のベンチマークによると、zstdのデフォルトレベル(レベル3)では、2.884倍の圧縮率で、驚異的な500 MB/sの圧縮速度と1,600 MB/sを超える解凍速度を達成しています。比較として、gzipのデフォルトレベルでは、約130 MB/sの圧縮速度と400 MB/sの解凍速度で2.743倍の圧縮率が得られます。数字は嘘をつきません。zstdは両方向で高速であり、デフォルトでファイルをわずかに圧縮します。 bzip2のような他のツールは、より良い圧縮率(約3.0倍)を達成できますが、圧縮速度はカタツムリのように遅く、20 MB/sを下回ることが多いです。また、xzは3.2倍を超える圧縮率を達成するものの、10 MB/s未満の圧縮速度では、時間制約のあるものには全く使えません。 zstdの真の力は、その22段階の圧縮レベルにあります。レベル1は速度重視で、リアルタイムのネットワークトラフィックの圧縮に最適です。他方、レベル19~22(「ウルトラ」モード)は、xzの圧縮率に匹敵しつつも、桁違いに速い解凍速度を維持します。ほとんどの人は3~9の範囲にこだわるでしょう。Linuxでは、これを簡単に制御できます。`zstd -9 myfile.tar`はデフォルトの`zstd -3 myfile.tar`よりも多くのCPU時間を要しますが、より小さなファイルを生成します。
辞書トレーニング:ほとんどの人が見過ごす機能
辞書圧縮は、zstdの最も強力でありながら、最も見過ごされている機能の1つです。標準的な圧縮アルゴリズムは、単一ファイル内の繰り返しパターンを見つけることで機能します。しかし、2KBのJSONペイロードのようにファイルが小さい場合はどうでしょうか?アルゴリズムが繰り返されるものの有用なモデルを構築するのに十分なデータがないため、圧縮率はしばしばひどいものになります。場合によっては、「圧縮された」ファイルが元のファイルよりも大きくなることさえあります。 辞書トレーニングがその解決策です。zstdに大量のデータサンプル(例えば、数千の類似した小さなログファイルやJSONオブジェクト)を与えることで、それらすべての共通パターンを捉える単一の辞書ファイルを生成できます。その後、圧縮側と解凍側の両方がこの共有辞書を出発点として使用します。Facebookは、この技術を使って、それまでほとんど圧縮できなかった小さなJSONブロブで6倍の圧縮を達成したと報告しています。 コマンドラインから自分で試すには、まず辞書をトレーニングします。`zstd --train /path/to/samples/* -o mydict.zst-dict`。次に、それを使ってファイルを圧縮します。`zstd -D mydict.zst-dict smallfile.json`。唯一の注意点は、解凍側も全く同じ辞書ファイルを必要とすることです。これは運用上の課題となり、データを配布する際に辞書も一緒に保存し、配布する必要があるでしょう。 では、実際にこれを使うのは誰でしょうか?データベースエンジニア、APIレスポンスを圧縮するバックエンド開発者、そして構造的に類似した大量の小さなファイルを扱うすべての人にとって、これは画期的なものです。フォルダを圧縮するだけの一般ユーザーにとっては、標準のzstdで十分すぎるほどです。
実際に.zstファイルに出会う場所
おそらく、あなたは意識しないうちにzstdを使っているはずです。このアルゴリズムはFacebookのサーバーをはるかに超えて広がり、今や現代のソフトウェア環境の重要な一部となっています。ここでは、あなたが実際に.zstファイルに出会う具体的な場所をいくつか紹介しましょう。 **Linuxパッケージマネージャー。** Arch Linuxは2020年に.tar.xzから.tar.zstへの切り替えを行い、パッケージインストール速度の大幅な向上を挙げました。Fedoraもそれに続いています。`pacman -S`や`dnf install`を実行すると、.zstで圧縮されたファイルをダウンロードし、展開していることになります。 **Linuxカーネル自体。** バージョン5.16以降、カーネルイメージ(bzImage)とinitramfsはzstdで圧縮できるようになりました。一部のディストリビューションでは、起動時間の著しい高速化のために、zstdで圧縮されたカーネルをデフォルトで出荷しています。 **データベースとストレージシステム。** Facebook独自のRocksDBはネイティブでzstdをサポートしており、人気のある分析データベースであるClickHouseもzstdを推奨コーデックとしています。PostgreSQL 15では、論理レプリケーションメッセージに対するzstdサポートも追加されました。 **大規模データセットのダウンロード。** Hugging Faceや他の学術アーカイブにアクセスすると、多くの機械学習データセットが現在.zstまたは.tar.zstファイルとして配布されていることがわかるでしょう。歴史的に.warc.gzファイルで有名だったCommon Crawlデータセットでさえ、より多くの.zstエクスポートが見られます。 **ゲームアセットとソフトウェア配布。** MozillaはFirefoxのアップデートをより効率的に配信するためにzstdを使用しており、一部のゲームエンジンはゲームプレイ中の高速アセットストリーミングのために内部的にそれを使用しています。 良いニュースは、これらのシナリオのほとんどで、特別なことをする必要がないということです。ファイルを開いたり抽出したりするだけであれば、7-Zip(バージョン19.00以降が.zstをサポート)のようなシステムの最新ツールが自動的に処理してくれるでしょう。
コマンドラインを使わずに.zstファイルを開いて変換する方法
正直に言って、誰もがターミナルで作業したり、圧縮フラグを覚えたりしたいわけではないでしょう。もし.zstファイルが送られてきて、中身を取り出す必要があるだけなら、OSに応じていくつかの簡単な選択肢があります。 **Windows:** ここでは7-Zipがあなたの親友です。バージョン22.00(2022年7月リリース)で完全なzstdサポートが追加されました。 .zstファイルを右クリックし、「7-Zip > ここに展開」を選択するだけで完了です。もし動作しない場合は、おそらく古いバージョンなので、アップデートするだけでよいでしょう。 **macOS:** 組み込みのアーカイブユーティリティはまだ.zstを処理できませんが(macOS Sequoia現在)、優れた無料のKekaアーカイバーは完璧に処理します。あるいは、Homebrewを使用している場合は、ターミナルで`brew install zstd`を実行し、続けて`zstd -d file.zst`を実行すればよいでしょう。 **Linux:** ほとんどの場合、問題ないでしょう。`zstd`コマンドラインツールは、おそらくすでにインストールされているか、パッケージマネージャーで利用可能です。解凍するには、`zstd -d file.zst`を実行するだけです。tarアーカイブの場合は、`tar --use-compress-program=zstd -xf file.tar.zst`が伝統的なコマンドですが、多くの最新システムでは、よりシンプルな`tar -I zstd -xf file.tar.zst`もサポートしています。 **ブラウザベースの変換:** ここでCocoConvertのようなツールが輝きます。ソフトウェアをインストールせずに.zstファイルを解凍する必要がある場合、CocoConvertにアップロードして、ブラウザでその内容を直接抽出できます。これは、適度なサイズのシングルストリーム.zstファイルに最適です。大規模な数ギガバイトの.tar.zstアーカイブやカスタム辞書に依存するファイルの場合は、ローカルツールの方が実用的でしょう。CocoConvertはこの点について透明性があります。あらゆるエッジケースではなく、一般的なケースを鮮やかに処理するために作られているのです。
.zstファイルの作成:いつ使うべきか、いつ使うべきでないか
Zstandardは、開発者、システム管理者、またはすでにそれをサポートしている自動化システムといった特定のユーザー向けにファイルを圧縮する場合、素晴らしい選択肢となります。内部アーカイブ、ソフトウェアの配布、または相手側での高速解凍が優先されるデータ転送に最適です。 しかし、標準のWindowsマシンでファイルを開く非技術系の人にファイルを送る場合は、絶対に間違った選択です。その仕事には、Zipが依然として王者です。どの最新OSも.zipファイルをすぐに処理でき、何の疑問もなく、追加のソフトウェアも不要です。zstdは普及しつつありますが、カジュアルなファイル共有にはまだそこまで至っていません。動作するものを選びましょう。 しかし、自分のファイルをアーカイブする場合は話が異なります。zstdをより高いレベル(-9など)で使用するのは、素晴らしい妥協点です。xzで10GBのフォルダが圧縮されるのを画面を見つめて待ったことのある人なら、その苦痛を知っているでしょう。8~12分かかることもあります。同じフォルダでも、`zstd -9`を使えばわずか90秒で済み、ファイルサイズもわずかに大きくなるだけです。これは、私がいつでも受け入れるトレードオフです。 CocoConvertで.zstファイルを作成するには、ソースファイルをアップロードし、出力形式として.zstを選択できます。デフォルトの圧縮レベルでほとんどすべてに対応できるでしょう。CocoConvertは個々のファイルを圧縮することに留意してください。フォルダ全体を単一の.tar.zstアーカイブにまとめたい場合は、まず自分のマシンで.tarファイルを作成してから圧縮するか、`tar -I zstd -cf output.tar.zst folder/`のようなローカルコマンドを使用する必要があるでしょう。
正直なまとめ:Zstandardを学ぶ価値はあるか?
はっきりさせておきましょう。Zstandardは、いずれ消え去るようなニッチな形式ではありません。Linuxカーネルに深く組み込まれ、主要なデータベースで利用され、大規模なLinuxディストリビューションのパッケージマネージャーに採用されています。Metaからの支援と活発なオープンソースコミュニティ、そして公式のRFC標準化により、ソフトウェアエコシステムの安定した長期的な一部となることは保証されています。 開発者やシステム管理者にとって、zstdの使い方は基本的なスキルになりつつあります。圧縮レベル間のトレードオフを理解し、辞書がいつ役立つかを知り、.zstと.tar.zstの関係を把握することは、現代のインフラを管理する上で直接的に時間とリソースを節約することにつながるでしょう。 一般ユーザーにとっての教訓は、はるかにシンプルです。.zstファイルを見たら、それが何であるかがわかるでしょう。つまり、圧縮されたアーカイブです。ビデオや奇妙な文書ではなく、単なるコンテナです。そして、Windowsで7-Zipをアップデートしたり、macOS用にKekaを入手したり、CocoConvertのようなウェブツールを使ったりと、簡単に開く方法があることも知っているはずです。 しかし、zstdがすべてを征服したわけではありません。その唯一残された弱点は、カジュアルな個人間のファイル共有です。WindowsとmacOSが.zipファイルのようにダブルクリックするだけで.zstファイルを開けるようになるまで、受信者には少し余分な手間を要する形式であり続けるでしょう。しかし、サーバーのワークロード、ソフトウェア配布、データベース圧縮、大規模アーカイブなど、ほとんどすべての点でzstdはすでに勝利を収めています。それは新しい常識的なデフォルトであり、非常に良い理由があるのです。