20万件の記録を、項目名つきの文字で書くと15.8MBでした。
形を先に決めて値だけ並べると2.3MBです。読み取りは142倍速くなりました。
形を先に決めておけば、値ごとに付ける情報がなくなります。差はそこから出ます。
Avroは形を先に決めます。公式はAvroは形に依拠すると述べたうえで、その効果をこう説明しています。
これにより、各データは値ごとの余計な情報なしに書けるようになり、直列化は速くも小さくもなるという記述です。
どれだけ違うのかを、20万件を実際に符号化して測りました。
1件は5項目です。項目名つきの文字と、形を決めて値だけ並べる2通りを比べます。
注文の記録 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倍の差は残ります。縮める処理そのものにも時間がかかります。
つまり「縮めれば同じ」ではありません。縮める前の量が、そのまま処理する側の負担になります。
縮めると差は縮むが、消えはしない。
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
形が手元にあることが前提です。値の位置が決まっているので、探さずに読めます。
Avroでは、読むときに形が必要です。公式はAvroのデータが読まれるとき、それを書いたときに使われた形は常に存在すると述べています。
形があるので、何番目の何バイトが何かが分かります。探す処理が要りません。
20万件から金額の合計を出す処理で測りました。
金額の合計を出すのにかかる時間 名前つきの文字 50.9ms 行ごとに並べたもの 0.4ms(142倍速い) 列ごとに並べたもの 0.4ms(141倍速い)
50.9msが0.4msになります。142倍です。
大きさの比は6.88倍でした。時間の比のほうが20倍大きいことになります。
名前つきの文字では、1件ごとに構造を解析します。区切りを探し、名前を照合し、数値に直します。
形を決めた方式では、決まった位置から4バイト読むだけです。解析がありません。
だから量を減らす以上に、時間が減ります。減っているのは量ではなく、1件あたりの作業です。
同じ構図は、印の多い形と少ない形を比べたSAMLの記事でも扱いました。そちらは属性が増えるほど比が縮む形でした。
When Avro data is read, the schema used when writing it is always present.原文Apache Avro 公式ドキュメント(1.12.0) この内容の有効期限2027-02-18
形を共有している以上、変え方に制約が出ます。足す位置で結果が変わります。
Avroでは、あらかじめ変換の記述を作る必要がありません。公式はデータのファイルを読み書きするのにも、遠隔の手続きの取り決めを使ったり実装したりするのにも、コードの生成は必要ないと述べています。
生成が要らない代わりに、形が変わったときの扱いは自分で考えることになります。
形を先に決めておく方式で、あとから項目を変えた場合 古い読み手が新しい記録を読めるかを整理する 変え方 古い読み手 理由 末尾に項目を足す 読める 知らない項目を飛ばせる形なら 途中に項目を足す 読めない 位置で読む形では、以降がすべてずれる 項目名を変える 読めない 名前で引く形では見つからなくなる 項目を消す 読めない 必須として読んでいれば失敗する 既定値つきで足す 読める 古い記録にはその値が入っているものとして扱える
読めるのは2つだけです。末尾に足すか、既定値つきで足すかです。
途中に足した場合に何が起きるかも数えました。
位置で読む形で、3番目に「通貨」を足した場合 位置 古い読み手が期待 新しい記録の中身 一致 1番目 番号 番号 ○ 2番目 分類 分類 ○ 3番目 金額 通貨 × 4番目 日 金額 × 5番目 個数 日 ×
5項目のうち3項目がずれます。足した位置より後ろは全部です。
だから運用の規則は単純になります。足すなら末尾、消すなら消さないという形です。
静かに壊れる点にも注意が要ります。3番目に通貨を入れても、数値として読めてしまうことがあります。
形の変更が下流を壊す話はデータ契約の記事で扱いました。意味だけを変える場合は、この表のどれにも当たらず止まりません。
実在のAvroの実装は使わず、形を決めて値だけを並べる方式をその場で実装して測っています。実際のAvroは可変長の整数を使うなど、この計測より小さくなる符号化を含みます。読み取りの時間も編集部環境での実測で、機械が違えば値は変わります。項目を変えたときの表は、位置で読む形を前提に整理したものです。ここで見せているのは、項目名を毎回書かないことの効きが、大きさより時間に大きく出るという関係です。
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
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る