by oschene under CC
@voluntasに、SQLiteをプログラミング言語間の中間ファイルに使っている、ということを言ったらちょっとビックリされたので、僕なりの中間ファイルに使う基準とかを軽くまとめてみます。あんまり厳密なベンチマークとかは取ってません。フィーリングで書いてます。
SQLite
Pythonをはじめとして、多くの言語でデフォルトで使えちゃったりする、オンメモリRDBです。Rubyも早く同梱してくれればいいのに。出力したデータの一部だけを利用するような、ランダムアクセスの場合は効率がいいです。
- 読み込むプログラムは、作成したデータの一部しか利用しない
- ちょっと凝った検索がしたい
- ちょっとした構造体並のデータ構造が表現したい。型も
- 表形式のデータ
KeyValueストア
あんまり使ってないけど、きっとSQLiteよりは高速なんだろうね。
- 読み込むプログラムは、作成したデータの一部しか利用しない時に
- 簡単なデータ構造さえあればいい。
- 一番外枠のデータ構造が辞書型
XML with SAX
XMLです。まぁ良くある形式なので書くまでもないけど。
- シーケンシャルに処理をしたい。データは最終的に全部使う。
- 木構造。あんまり深い構造だと実装が大変なのでシンプルな時に
- 型をきちんと持ったデータを扱いたい
- 中間形式は目で見えたり、エディタで編集できるとうれしい
JSON/XML with DOM
JSONはSAXパーサとかみたいなのはないと思うので、使う条件としてはDOMと一緒かな、と思います。
- シーケンシャルに処理しにくいデータを扱う。複雑な木構造とか。
- 読み込み側はデータは全体を利用する。
- 型をきちんと持ったデータを利用したい
- 中間形式は目で見えたり、エディタで編集できるとうれしい
- 表形式で表現できない複雑な形式に
マーシャル
Pythonだとpickle, marshal, RubyだとMarshal。言語の専用のライブラリです。今だと、XML pickle, JSON pickleなど共通フォーマットはあるだろうけど、そこまでは面倒見切れていないのでパス。
- 違う言語から利用することはない。
- プログラミングはとことん簡単にすませたい。
- 型などは言語の型をそのまま利用したい。
- シーケンシャルで先頭の少しだけ、というアクセスはしない。
- 表形式で表現できない複雑な形式に
Excel
こしばさんのRubyKaigi09のLTで紹介されたExcel。ITの人の都合を考えなければ最強フォーマット。ネタっぽいけど、Pythonの場合は、読み込み用のxlrd、書き込み用のxlwtというライブラリがあり、ExcelもCOMもなくても、それどころかLinux上でもなんでもExcelファイルが扱えるので、実はかなり使いやすいのです。速度もCOM経由よりも抜群に速いし。pyExcelaratorというのが今まであったけど、今メンテされ続けているのは上記の2つ。
- 中間形式をユーザ/開発者が見たり、編集できるとよい
- 中間データの集計やグラフ化をユーザが自分で行う可能性がある
- 中間形式もフォーマットを整えて、見た目を良くしたい
- 型をきちんと持ったデータが扱いたい
- データの全体を使用する
- データが表形式で表現しやすい
pickleもデータ量がMB単位になっちゃうと、ちょっと辞書形式にしてデータの検索をしたいと思ってもロードにかかる時間が無視できなくなったりします。そこでSQLiteにしてみたりとか、今までの試行錯誤の結果です。網羅的に検証したりしておらず、適当に書いただけなので、ツッコミどころとか、「これがもっといいよ!」とか色々あると思いますが、そういうのはトラックバックとかコメントとかをいただけるとうれしいです。