データ基盤

Avroとは|項目名を1件ずつ書かないだけで、15.8MBが2.3MBになった

何を先に決める方式なのかどれだけ小さくなるのか項目を変えるとどうなるのか

20万件の記録を、項目名つきの文字で書くと15.8MBでした。

形を先に決めて値だけ並べると2.3MBです。読み取りは142倍速くなりました。

この記事の要点

  • 文字なら15.8MB
  • 形を決めて2.3MB
  • 読み取りは142倍
  • 途中に足すと3項目ずれる

項目名を1件ずつ書かないだけで、15.8MBが2.3MBになった

形を先に決めておけば、値ごとに付ける情報がなくなります。差はそこから出ます。

Avroは形を先に決めます。公式はAvroは形に依拠すると述べたうえで、その効果をこう説明しています。

これにより、各データは値ごとの余計な情報なしに書けるようになり、直列化は速くも小さくもなるという記述です。

どれだけ違うのかを、20万件を実際に符号化して測りました。

3つの詰め方で書く

1件は5項目です。項目名つきの文字と、形を決めて値だけ並べる2通りを比べます。

text
注文の記録 200,000件。1件は5項目(番号・分類・金額・日・個数)

詰め方                        そのまま  縮めたあと  そのままの比
名前つきの文字で書く                      15.8MB       1.9MB         6.88倍
形を決めて行ごとに並べる                     2.3MB       1.4MB         1.00倍
形を決めて列ごとに並べる                     2.3MB       1.4MB         1.00倍

そのままなら15.8MBと2.3MBです。6.88分の1になります。

縮めたあとを見てください。1.9MBと1.4MBで、差は1.36倍まで縮みます

縮めれば同じではない

項目名は毎回同じ文字なので、縮める処理がよく効きます。だから差が縮まります

それでも1.36倍の差は残ります。縮める処理そのものにも時間がかかります

つまり「縮めれば同じ」ではありません。縮める前の量が、そのまま処理する側の負担になります。

縮めると差は縮むが、消えはしない。

名前つきの文字縮めたあと1.9縮めれば減る分13.915.8MB形を決めて並べる1.40.92.3MB−85%(13.5MB)20万件・5項目での実測。そのままなら6.88倍の差だが、縮めたあとは1.36倍まで縮まる。
図1 ── 詰め方ごとの大きさ
出典Apache Avro 公式ドキュメント(1.12.0)2026-08-18 確認
This permits each datum to be written with no per-value overheads, making serialization both fast and small.
原文Apache Avro 公式ドキュメント(1.12.0) この内容の有効期限2027-02-18

読むときも形が要る。その代わり142倍速い

形が手元にあることが前提です。値の位置が決まっているので、探さずに読めます。

Avroでは、読むときに形が必要です。公式はAvroのデータが読まれるとき、それを書いたときに使われた形は常に存在すると述べています。

形があるので、何番目の何バイトが何かが分かります。探す処理が要りません。

読み取りの時間

20万件から金額の合計を出す処理で測りました。

text
金額の合計を出すのにかかる時間

  名前つきの文字        50.9ms
  行ごとに並べたもの      0.4ms(142倍速い)
  列ごとに並べたもの      0.4ms(141倍速い)

50.9msが0.4msになります。142倍です。

大きさの比は6.88倍でした。時間の比のほうが20倍大きいことになります。

なぜ時間のほうが開くか

名前つきの文字では、1件ごとに構造を解析します。区切りを探し、名前を照合し、数値に直します。

形を決めた方式では、決まった位置から4バイト読むだけです。解析がありません。

だから量を減らす以上に、時間が減ります。減っているのは量ではなく、1件あたりの作業です。

同じ構図は、印の多い形と少ない形を比べたSAMLの記事でも扱いました。そちらは属性が増えるほど比が縮む形でした。

出典Apache Avro 公式ドキュメント(1.12.0)2026-08-18 確認
When Avro data is read, the schema used when writing it is always present.
原文Apache Avro 公式ドキュメント(1.12.0) この内容の有効期限2027-02-18

途中に項目を足すと、以降がすべてずれる

形を共有している以上、変え方に制約が出ます。足す位置で結果が変わります。

Avroでは、あらかじめ変換の記述を作る必要がありません。公式はデータのファイルを読み書きするのにも、遠隔の手続きの取り決めを使ったり実装したりするのにも、コードの生成は必要ないと述べています。

生成が要らない代わりに、形が変わったときの扱いは自分で考えることになります。

変え方ごとの影響

text
形を先に決めておく方式で、あとから項目を変えた場合
古い読み手が新しい記録を読めるかを整理する

変え方              古い読み手  理由
末尾に項目を足す                   読める  知らない項目を飛ばせる形なら
途中に項目を足す                  読めない  位置で読む形では、以降がすべてずれる
項目名を変える                   読めない  名前で引く形では見つからなくなる
項目を消す                     読めない  必須として読んでいれば失敗する
既定値つきで足す                   読める  古い記録にはその値が入っているものとして扱える

読めるのは2つだけです。末尾に足すか、既定値つきで足すかです。

途中に足した場合に何が起きるかも数えました。

text
位置で読む形で、3番目に「通貨」を足した場合

位置  古い読み手が期待  新しい記録の中身  一致
1番目                 番号                番号     ○
2番目                 分類                分類     ○
3番目                 金額                通貨     ×
4番目                  日                金額     ×
5番目                 個数                 日     ×

5項目のうち3項目がずれます。足した位置より後ろは全部です。

決めておくこと

だから運用の規則は単純になります。足すなら末尾、消すなら消さないという形です。

静かに壊れる点にも注意が要ります。3番目に通貨を入れても、数値として読めてしまうことがあります。

形の変更が下流を壊す話はデータ契約の記事で扱いました。意味だけを変える場合は、この表のどれにも当たらず止まりません。

余談 この計測での注意

実在のAvroの実装は使わず、形を決めて値だけを並べる方式をその場で実装して測っています。実際のAvroは可変長の整数を使うなど、この計測より小さくなる符号化を含みます。読み取りの時間も編集部環境での実測で、機械が違えば値は変わります。項目を変えたときの表は、位置で読む形を前提に整理したものです。ここで見せているのは、項目名を毎回書かないことの効きが、大きさより時間に大きく出るという関係です。

出典Apache Avro 公式ドキュメント(1.12.0)2026-08-18 確認
Code generation is not required to read or write data files nor to use or implement RPC protocols.
原文Apache Avro 公式ドキュメント(1.12.0) この内容の有効期限2027-02-18

よくある質問

Avroは何を先に決めますか
形です。公式は、Avroが形に依拠すると述べており、値ごとの余計な情報を書かずに済むとしています。
どれだけ小さくなりますか
この計測では15.8MBが2.3MBになりました。6.88分の1です。
読み取りはどれだけ速いですか
金額の合計を出す処理で、50.9msが0.4msになりました。142倍です。
項目を変えるとどうなりますか
足す位置によります。末尾なら読めますが、途中に足すと以降がすべてずれます。

まとめ

  • 形を先に決める
  • 値だけを並べる
  • 書いた形は読むときも要る
  • 変えるなら末尾に足す

今日から始められること

  1. いま項目名を1件ずつ書いていないか確かめる
  2. その量を測る
  3. 形を決められる箇所を探す
  4. 項目を足すときの位置を決めておく

実務で組んだAvroのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る