groonga-databse-inspectを使ってMilkodeのデータ使用量を分析する

この記事はGroonga Advent Calendar 2013の6日目です。

これは何?

[groonga-dev,01926] Rroonga 3.1.0

今回のリリースではgroonga-database-inspectというコマンドを追 加しています。このコマンドはデータベースの詳細を表示します。

Rroonga3.1.0からgroonga-database-inspectというコマンドが追加されました。 Groongaの夕べ4の懇親会でも

  • (質問者様) Milkodeって大体容量どれ位使うの?
  • (私) え?(ちゃんと測った事無いぞー)

ということがあったので、しっかりと答えられるようになりたいです。

※ 先に結論を書いてしまうと登録したいパッケージの2.5倍位でした。どうやって調べたかを今から説明します。

インストール

Rroonga3.1.0を入れると自動で付いてきます。

$ gem install rroonga
rroonga (3.1.0)

使い方

Milkodeのデータベースサイズを測ってみます。 データベース位置はデフォルトで~/.milkode/db/milkode.dbです。

テストに使ったのは私が個人的に使用しているMilkodeのデータベース(171 packages, 145744 files) です。

$ groonga-database-inspect ~/.milkode/db/milkode.db
Database
  Path:             </Users/ongaeshi/.milkode/db/milkode.db>
  Total disk usage: 3.521GiB
  Disk usage:       29.266MiB (0.812%)
  N records:        528912
  N tables:         3
  N columns:        17
  Plugins:
    None
  Tables:
    documents:
      ID:               256
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/.milkode/db/milkode.db.0000100>
      Total disk usage: 1.349GiB (38.308%)
      Disk usage:       28.062MiB (0.778%)
      N records:        145744
      N columns:        6
      Columns:
        content:
          ID:         260
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000104>
          Disk usage: 1.199GiB (34.062%)
        package:
          ID:         258
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000102>
          Disk usage: 16.262MiB (0.451%)
        path:
          ID:         257
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000101>
          Disk usage: 36.262MiB (1.006%)
        restpath:
          ID:         259
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000103>
          Disk usage: 44.262MiB (1.227%)
        suffix:
          ID:         262
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000106>
          Disk usage: 24.262MiB (0.673%)
        timestamp:
          ID:         261
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000105>
          Disk usage: 4.004MiB (0.111%)
    packages:
      ID:               269
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/.milkode/db/milkode.db.000010D>
      Total disk usage: 68.602MiB (1.902%)
      Disk usage:       16.062MiB (0.445%)
      N records:        171
      N columns:        6
      Columns:
        addtime:
          ID:         272
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000110>
          Disk usage: 4.004MiB (0.111%)
        directory:
          ID:         271
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010F>
          Disk usage: 20.262MiB (0.562%)
        favtime:
          ID:         275
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000113>
          Disk usage: 4.004MiB (0.111%)
        name:
          ID:         270
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010E>
          Disk usage: 16.262MiB (0.451%)
        updatetime:
          ID:         273
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000111>
          Disk usage: 4.004MiB (0.111%)
        viewtime:
          ID:         274
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000112>
          Disk usage: 4.004MiB (0.111%)
    terms:
      ID:               263
      Type:             patricia trie
      Key type:         ShortText
      Tokenizer:        TokenBigramSplitSymbolAlphaDigit
      Normalizer:       NormalizerAuto
      Path:             </Users/ongaeshi/.milkode/db/milkode.db.0000107>
      Total disk usage: 2.077GiB (58.978%)
      Disk usage:       12.047MiB (0.334%)
      N records:        382997
      N columns:        5
      Columns:
        documents_content:
          ID:         267
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010B>
          Disk usage: 1.834GiB (52.074%)
        documents_package:
          ID:         265
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000109>
          Disk usage: 55.789MiB (1.547%)
        documents_path:
          ID:         264
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000108>
          Disk usage: 93.789MiB (2.601%)
        documents_restpath:
          ID:         266
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010A>
          Disk usage: 62.289MiB (1.727%)
        documents_suffix:
          ID:         268
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010C>
          Disk usage: 25.039MiB (0.694%)

3.5GB, 528912 records, 3 tables, 17 columns ありました。

documents (ファイル情報), packages (パッケージ情報), terms (転置インデックス) の3つのテーブルがあり、それぞれ

  • documents 1.349GiB (38.308%)
  • packages 68.602MiB (1.902%)
  • terms 2.077GiB (58.978%)

でした。ざっくりではありますが、データベースは

登録するパッケージのファイル容量 × 2.5

位になっているようです。

空のデータベースと比較

もう少し遊んでみます。空のMilkodeデータベースを作って値を比較してみます。

$ milk init ~/tmp/milkode_test/empty
create     : milkode_test/empty/milkode.yaml
create     : /Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db created.

何も追加されていない状態だとデータベースサイズは29MB位のようです。

$ groonga-database-inspect ~/tmp/milkode_test/empty/db/milkode.db
Database
  Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db>
  Total disk usage: 29.984MiB
  Disk usage:       21.266MiB (70.922%)
  N records:        0
  N tables:         3
  N columns:        17
  Plugins:
    None
  Tables:
    documents:
      ID:               256
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000100>
      Total disk usage: 1.375MiB (4.586%)
      Disk usage:       64.000KiB (0.208%)
      N records:        0
      N columns:        6
      Columns:
        content:
          ID:         260
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000104>
          Disk usage: 268.000KiB (0.873%)
        package:
          ID:         258
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000102>
          Disk usage: 268.000KiB (0.873%)
        path:
          ID:         257
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000101>
          Disk usage: 268.000KiB (0.873%)
        restpath:
          ID:         259
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000103>
          Disk usage: 268.000KiB (0.873%)
        suffix:
          ID:         262
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000106>
          Disk usage: 268.000KiB (0.873%)
        timestamp:
          ID:         261
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000105>
          Disk usage: 4.000KiB (0.013%)
    packages:
      ID:               269
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010D>
      Total disk usage: 616.000KiB (2.006%)
      Disk usage:       64.000KiB (0.208%)
      N records:        0
      N columns:        6
      Columns:
        addtime:
          ID:         272
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000110>
          Disk usage: 4.000KiB (0.013%)
        directory:
          ID:         271
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010F>
          Disk usage: 268.000KiB (0.873%)
        favtime:
          ID:         275
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000113>
          Disk usage: 4.000KiB (0.013%)
        name:
          ID:         270
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010E>
          Disk usage: 268.000KiB (0.873%)
        updatetime:
          ID:         273
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000111>
          Disk usage: 4.000KiB (0.013%)
        viewtime:
          ID:         274
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000112>
          Disk usage: 4.000KiB (0.013%)
    terms:
      ID:               263
      Type:             patricia trie
      Key type:         ShortText
      Tokenizer:        TokenBigramSplitSymbolAlphaDigit
      Normalizer:       NormalizerAuto
      Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000107>
      Total disk usage: 6.742MiB (22.486%)
      Disk usage:       4.047MiB (13.497%)
      N records:        0
      N columns:        5
      Columns:
        documents_content:
          ID:         267
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010B>
          Disk usage: 552.000KiB (1.798%)
        documents_package:
          ID:         265
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000109>
          Disk usage: 552.000KiB (1.798%)
        documents_path:
          ID:         264
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000108>
          Disk usage: 552.000KiB (1.798%)
        documents_restpath:
          ID:         266
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010A>
          Disk usage: 552.000KiB (1.798%)
        documents_suffix:
          ID:         268
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010C>
          Disk usage: 552.000KiB (1.798%)

Groongaデータベースをダンプ、レストアしたい

groonga-database-inspectを使えばデータサイズを解析出来るようになりましたが、バックアップや巻き戻しといったことは出来ないのでしょうか?Rroongaインストール時に一緒についてくるgrndumpというツールを使うと可能なようです。

詳しくは以下の記事をどうぞ。

まとめ

  • Milkodeは登録するパッケージのファイル容量 × 2.5位でデータベースが作成可能っぽい
    • ざっくり分析なのでもう少しサンプルを取ってみたい(他にサンプルとった方がいましたらネットに書いてくれたら嬉しい)
  • groonga-database-inspect便利、Rroonga3.1.0についてくる
  • grndumpを使えばGroongaデータベースのダンプ、レストアも出来る

この辺、自前でデータ管理していると貧弱になりがちな所なので、せっかくGroongaを使っているなら積極的に活用していきたいです。