alltools.one
YAML
2025-06-13
5 min
alltools.one Team
YAMLMinificationOptimizationConfigurationPerformance

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の複雑さを適切に管理します。

関連リソース

Published on 2025-06-13
YAML Minification: When and How to Compress YAML Files | alltools.one