簡易的なデータベース

仕事で簡易的なDBを利用したくてPythonでできないか検討していた。MS AccessSQLiteなどの外部のDBを利用しないでやる方法として直列化(serialize)で検討している。直列化の標準モジュールとして、marshal、pickle/cPickle、shelveがある。どれが良いのか検討しているが、Pythonライブラリリファレンスに以下のようにあったのでmarchalは脱落。

Python には marshal と呼ばれるより原始的な直列化モジュールがありますが、一般的に Python オブジェクトを直列化する方法としては pickle を選ぶべきです。marshal は基本的に .pyc ファイルをサポートするために存在しています。

以下にそれぞれの特徴を挙げる。

  • marchal
    • cPickleより動作が速い
    • 保存、復元されるデータはOSに依存しないが、Pythonのバージョンには依存する
    • marchalで扱えるデータ量はマシン上の制限以外の制限はない
  • pickle/cPickle
    • cPickleはpickleのC言語実装版であり高速。pickleと互換性もある。通常はcPickleを使えば良い
    • 保存、復元されるデータはOS、Pythonのバージョンに依存しない
    • 変換されるデータはデフォルトではテキストだが、バイナリにもできる。バイナリの場合、テキストよりも早くて軽い。但しバイナリはPython 2.3以降のみ利用可能
    • pickle/cPickleで扱えるデータ量はマシン上の制限以外の制限はない
  • shelve
    • 永続性のあるディクショナリのように使うことができる単純なインタフェースを提供している
    • データはDBM形式で保存される


簡単さで選ぶならshelveだが、自分で色々制御したくなりそうだからcPickleを使うのが一番無難かもしれない。gzipモジュールと組み合わせるとバイナリで保存したデータでもさらに圧縮できるらしいのでcPickleで少し調査してみるつもり。