YAMLの圧縮:YAMLファイルを圧縮するタイミングと方法
YAMLの可読性は、空白とインデントの寛大な使用によるものです。しかし、データをより小さな形式にする必要がある場合があります — 転送、他のフォーマットへの埋め込み、またはストレージの削減のためです。このガイドでは、圧縮が有効なケースとその技術を解説します。
YAMLの圧縮とは?
圧縮は、データ構造を保持しながら不要な空白を削除します:
圧縮前(168バイト):
server:
host: localhost
port: 8080
features:
- auth
- logging
- monitoring
圧縮後 — フロースタイル(76バイト):
server: {host: localhost, port: 8080, features: [auth, logging, monitoring]}
圧縮後 — JSON(同じデータ、83バイト):
{"server":{"host":"localhost","port":8080,"features":["auth","logging","monitoring"]}}
YAMLのフロースタイルは、キーの引用符が不要なため、実際にはJSONよりわずかにコンパクトです。
圧縮するべき場合
圧縮する
- 他のフォーマットへのYAML埋め込み:JSONやデータベースフィールド内にYAML文字列を格納する場合
- ネットワーク転送:高スループットシステムでのペイロードサイズ削減
- ログ出力:ログメッセージ内のコンパクトな表現
- 生成された出力:人間がほとんど読まないマシン生成のYAML
圧縮しない
- 設定ファイル:可読性がYAMLを使用する目的そのもの
- バージョン管理されたファイル:圧縮されたYAMLはひどいdiffを生成する
- 共同作業のファイル:チームメンバーが読み書きする必要がある
- テンプレートと例:ドキュメントとしての価値が失われる
圧縮テクニック
1. フロースタイルへの変換
YAMLはマッピングとシーケンスの両方でインライン表記をサポートしています:
# ブロックスタイル(読みやすい)
database:
host: localhost
port: 5432
options:
- sslmode=require
- timeout=30
# フロースタイル(コンパクト)
database: {host: localhost, port: 5432, options: [sslmode=require, timeout=30]}
2. コメントの削除
コメントにはデータ値がなく、安全に削除できます:
# 削除前
server:
host: localhost # メインサーバー
port: 8080 # HTTPポート
# 削除後
server:
host: localhost
port: 8080
3. 空白行の削除
余分な空白行は可読性を向上させますが、バイト数が増えます:
# 削除前(区切り行あり)
database:
host: localhost
logging:
level: info
# 削除後(コンパクト)
database:
host: localhost
logging:
level: info
4. JSONへの変換
YAML固有の機能(コメント、アンカー)が不要な場合、圧縮JSONへの変換が最もコンパクトなオプションです:
# yqを使用
yq -o=json '.' config.yaml | jq -c . > config.min.json
コマンドラインでの圧縮
# yqでフロースタイルに変換
yq -o=yaml '.. style="flow"' config.yaml
# コンパクトJSONに変換
yq -o=json -I=0 '.' config.yaml
# sedでコメント削除(基本)
sed '/^[[:space:]]*#/d' config.yaml | sed 's/[[:space:]]*#.*//'
# Pythonワンライナー
python3 -c "
import yaml, sys
data = yaml.safe_load(sys.stdin)
yaml.dump(data, sys.stdout, default_flow_style=True, width=10000)
" < config.yaml
インタラクティブなYAMLフォーマットと圧縮には、YAMLフォーマッターをご利用ください。
サイズ比較
一般的なDocker Composeファイル(10サービス)の場合:
| フォーマット | サイズ | 比率 |
|---|---|---|
| ブロックYAML(読みやすい) | 2,400バイト | 1.0x |
| フローYAML(圧縮) | 1,100バイト | 0.46x |
| JSON(圧縮) | 1,200バイト | 0.50x |
| Gzip(ブロックYAML) | 650バイト | 0.27x |
重要な知見:Gzip圧縮は、圧縮よりもはるかに効果的です。Gzipを有効にしたHTTP(標準的な慣行)でYAMLを転送している場合、圧縮はほとんど追加の利点をもたらしません。
より良い代替手段:圧縮
ネットワーク転送では、HTTP圧縮(gzip、brotli)はほぼ常に圧縮より優れています:
- Gzipはブロックスタイルのを70-80%削減する
- 読みやすいフォーマットは圧縮フォーマットと同程度のサイズに圧縮される
- デバッグのための可読性が維持される
ブロックYAML → Gzip: 2,400 → 650バイト(73%削減)
フローYAML → Gzip: 1,100 → 580バイト(47%削減)
圧縮されたブロックと圧縮されたフローの差は最小限です。
FAQ
圧縮されたYAMLはまだ有効なYAMLですか?
はい。フロースタイルのYAMLは完全に有効で、あらゆるYAMLパーサーでパース可能です。マッピングに中括弧、シーケンスに角括弧を使用します — 基本的にYAML内でのJSONライクな構文です。データ構造は同一で、フォーマットのみが異なります。
KubernetesマニフェストのためにYAMLを圧縮すべきですか?
いいえ。Kubernetesマニフェストは、読みやすく、バージョン管理され、簡単に編集できるべきです。標準のブロックスタイルYAMLを使用してください。転送サイズを削減する必要がある場合は、デプロイツールに圧縮を処理させてください。HelmチャートとKustomizeオーバーレイは、圧縮よりもYAMLの複雑さを適切に管理します。
関連リソース
- YAMLフォーマッター — YAMLファイルのフォーマットまたはコンパクト化
- YAML構文チュートリアル — ブロック vs フロースタイルの理解
- JSONからYAMLへの変換 — フォーマット間の変換