構造化データをテキストで保存しようと思ってYAMLとXMLで調べてみた
構造化されたデータをテキスト形式で保存しようと思って,最初はXMLで保存すればいいかなぁと考えていました。しかし,そもそもそんなに複雑な構造を持ったデータでもないし,そういえばYAMLってあったっけ?と思い出しました。
YAMLはその構造が単純な分,動作パフォーマンスについて期待ができます。XMLではXPathなどの周辺技術と組み合わせて使うことで威力が発揮できそうです。今回はデータ量が少ないので,実際はどちらでも構わないのですが,とりあえず,読み込みパフォーマンスと消費メモリに注目して調べてみました。
データ件数 [件] | 1件あたりの処理時間 [ミリ秒] | オブジェクトのサイズ [Bytes] |
---|---|---|
3 | 5.203 (1000 件の平均) | 218 |
30 | 24.22 (100 件の平均) | 442 |
300 | 187.8 (100 件の平均) | 2,234 |
3000 | 1777.5 (100 件の平均) | 16,570 |
データ件数 [件] | 1件あたりの処理時間 [ミリ秒] | オブジェクトのサイズ [Bytes] |
---|---|---|
3 | 10.11 (1000 件の平均) | 218 |
30 | 77.34 (100 件の平均) | 442 |
300 | 596.7 (100 件の平均) | 2,234 |
3000 | 5,567 (10 件の平均) | 16,570 |
最初の比較対象はPPMでインストールしたXML::Simple 2.14とYAML 0.66です。
生成されたハッシュリファレンスは同じデータ構造で,サイズは同じでした。
YAMLのほうが構造が簡単な分,速度的にも勝るかと思っていましたが,
XML::Simpleの方がパフォーマンスが倍以上に良かったのでした。
あれぇ...YAMLってダメなのかなぁ...?
そういえば,Movable Type 4でもYAMLが利用されていますが, こちらはYAML::Tinyと呼ばれるモジュールを使っているようです。 YAMLからリファレンスやエイリアスなどの機能が制限されたサブセットのようですが, こちらでも調べてみることにします。
データ件数 [件] | 1件あたりの処理時間 [ミリ秒] | オブジェクトのサイズ [Bytes] |
---|---|---|
3 | 1.938 (1000 件の平均) | 1,746 |
30 | 9.469 (1000 件の平均) | 14,390 |
300 | 87.50 (100 件の平均) | 140,382 |
3000 | 720.1 (100 件の平均) | 1,396,718 |
速度的には全く問題ありません。 ただ,同じ内容の重複するデータを素直に持ってしまっているためか, 変数のサイズはデータ件数に比例して増加していることがわかりました。
読み込みパフォーマンスを見ればYAML::Tinyが最速ですが,
大量のデータを持つのであれば,
パフォーマンス以上にXPathなどによるデータ操作が利点となるであろうXMLも候補として考えられそうです。
小さなデータであれば記述のわかりやすさがメリットになるYAMLが良さそうです。
使途に応じて最適な選択はまた変わってくるかと思いますが,何かの参考になれば幸いです。