エンジニアブログ

エンジニアブログ
MT技術情報

構造化データをテキストで保存しようと思ってYAMLとXMLで調べてみた

ぴろり上西 2008年01月11日

 構造化されたデータをテキスト形式で保存しようと思って,最初はXMLで保存すればいいかなぁと考えていました。しかし,そもそもそんなに複雑な構造を持ったデータでもないし,そういえばYAMLってあったっけ?と思い出しました。
 YAMLはその構造が単純な分,動作パフォーマンスについて期待ができます。XMLではXPathなどの周辺技術と組み合わせて使うことで威力が発揮できそうです。今回はデータ量が少ないので,実際はどちらでも構わないのですが,とりあえず,読み込みパフォーマンスと消費メモリに注目して調べてみました。

XML::Simple 2.14
データ件数 [件] 1件あたりの処理時間 [ミリ秒] オブジェクトのサイズ
[Bytes]
35.203 (1000 件の平均)218
3024.22 (100 件の平均)442
300187.8 (100 件の平均)2,234
30001777.5 (100 件の平均)16,570

YAML 0.66
データ件数 [件] 1件あたりの処理時間 [ミリ秒] オブジェクトのサイズ
[Bytes]
310.11 (1000 件の平均)218
3077.34 (100 件の平均)442
300596.7 (100 件の平均)2,234
30005,567 (10 件の平均)16,570

最初の比較対象はPPMでインストールしたXML::Simple 2.14とYAML 0.66です。 生成されたハッシュリファレンスは同じデータ構造で,サイズは同じでした。 YAMLのほうが構造が簡単な分,速度的にも勝るかと思っていましたが, XML::Simpleの方がパフォーマンスが倍以上に良かったのでした。
 あれぇ...YAMLってダメなのかなぁ...?

 そういえば,Movable Type 4でもYAMLが利用されていますが, こちらはYAML::Tinyと呼ばれるモジュールを使っているようです。 YAMLからリファレンスやエイリアスなどの機能が制限されたサブセットのようですが, こちらでも調べてみることにします。

YAML::Tiny 1.21
データ件数 [件] 1件あたりの処理時間 [ミリ秒] オブジェクトのサイズ
[Bytes]
31.938 (1000 件の平均)1,746
309.469 (1000 件の平均)14,390
30087.50 (100 件の平均)140,382
3000720.1 (100 件の平均)1,396,718

 速度的には全く問題ありません。 ただ,同じ内容の重複するデータを素直に持ってしまっているためか, 変数のサイズはデータ件数に比例して増加していることがわかりました。

 読み込みパフォーマンスを見ればYAML::Tinyが最速ですが, 大量のデータを持つのであれば, パフォーマンス以上にXPathなどによるデータ操作が利点となるであろうXMLも候補として考えられそうです。 小さなデータであれば記述のわかりやすさがメリットになるYAMLが良さそうです。
 使途に応じて最適な選択はまた変わってくるかと思いますが,何かの参考になれば幸いです。