[groonga-dev,02173] データベース肥大化に悩むみなさんへテストのお願い

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 3月 7日 (金) 16:46:46 JST


須藤です。

Groongaは次のような使い方をするとデータベースが肥大化してい
くという問題があります。

  * 可変長サイズのカラムを使っている
    * 例: ShortTextなどテキスト型
    * 例: ベクター(中身の型はなんでもよい)
  * 可変長サイズのカラムの中身をよく書き換える
    * 新規追加するだけでなく、削除・更新をするということ
  * 書き込む値のサイズは128バイト以上

この問題を解消する方法を実装したので、次の事について協力をお
願いします!

  * 本当に問題が解消するかテストして欲しい
  * こちらでの検証結果データをわかりやすく可視化して欲しい

それぞれ説明します。

○ 本当に問題が解消するかテストして欲しい

テストするにあたって、効果・注意点・確認方法を説明します。

○○ 効果

まず効果です。

  * カラムの値を削除・更新してもカラムのサイズが一定の範囲に収まります。
    (現在のGroongaはほぼ無限に増加しきます。)
  * 少し速くなります。

以下はこちらでの実験結果です。

まず、最大10KiBのカラム値を持つ1万件のレコードを追加します。
最大10KiBなので、1Bのデータもあれば、10KiBのデータもあります。

その後、ランダムでレコードを選び、値を書き換えることを1万回
繰り返します。

ランダムでの値書き換えをN回繰り返しました。それが次の表です。
「繰り返し」がN回目の繰り返しかで、「size(通常)」がこれまで
のGroongaで、「size(改良)」が改良版のGroongaです。

1回目(単に値を追加しただけの状態)では通常のほうがサイズは
小さいですが、それ以降のサイズの増加は改良の方が小さくなって
います。改良の方はもう少し繰り返すと増加が頭打ちになりますが、
通常の方はもっと増えていきます。

  繰り返し     size(通常)      size(改良)
  1           524,562,432    625,225,728
  2         1,044,656,128    973,352,960
  3         1,547,972,608  1,262,759,936
  4         2,038,706,176  1,535,389,696
  5         2,399,416,320  1,669,607,424
  6         2,554,605,568  1,690,578,944
  7         2,625,908,736  1,711,550,464
  8         2,625,908,736  1,711,550,464
  9         2,625,908,736  1,711,550,464
  10        2,625,908,736  1,732,521,984

同じ操作をした時にかかった時間です。
多くの繰り返しで改良の方が速くなっています。

  繰り返し  time(通常)  time(改良)
  1          0.337807    0.345637
  2          0.312178    0.215546
  3          0.314546    0.212623
  4          0.307669    0.203770
  5          0.242820    0.132868
  6          0.141963    0.075197
  7          0.098021    0.073813
  8          0.063184    0.062904
  9          0.063161    0.062393
  10         0.062920    0.072788

○○ 注意点

次に注意点です。

  * データベースの互換性がなくなります。
    新しくデータベースを再作成する必要があります。
  * 問題解消版のGroongaで通常のGroongaで作成したデータベース
    を開くと壊れます!壊れます!注意してください。
  * 書き込む値のサイズが65536バイト(64KiB)以上の場合は効果
    がありません。これまでと同じ挙動になります。
  * レコード数が少ない(100-1000くらい)場合はカラムサイズ
    が少し大きくなります。(数10MBくらい。)
  * レコードを追加するだけの場合は効果はありません。
    (これまで通りデータ量に応じて増えていく。)
  * 空間効率が悪くなるケースがあります。
    * 一番悪いケースが32768バイトのデータだけを追加していく
      ときで、2倍の空間を使います。
      (32768バイトに対して、
        65535バイトの領域を使う。)
    * 65535バイトなど2の累乗 - 1のサイズのデータを入れるとき
      は無駄がありません。

○○ 確認方法

最後に確認方法です。

まず、現在のGroongaのデータベースのサイズを確認します。
Rroongaが必要なのでインストールします。

  % gem install rroonga
  % groonga-database-inspect db_path > old_size.txt

ダンプファイルを作ります。

  % grndump db_path > dump.grn

2014/3/7以降のスナップショット版を使います。スナップショット
版のインストール方法は次の通りです。

  % wget http://packages.groonga.org/nightly/groonga-4.0.0.2014.03.07.tar.gz
  % tar xvzf groonga-4.0.0.2014.03.07.tar.gz
  % ./configure --with-ja-segregate-threshold=16
  (CMakeを使う場合はCMake -DGRN_JA_SEGREGATE_THRESHOLD=16)
  % make
  % make install

インストールしたら新しくデータベースを作ります。

  % groonga -n db_new_path < dump.grn

通常通り使ってください。しばらくしたらデータベースのサイズを
確認します。

  % groonga-database-inspect db_path > new_size.txt

次の情報を教えてください。

  * old_size.txt
  * new_size.txt
  * どのくらい可変長サイズのカラムを追加・更新・削除しているか
  * 値は壊れなかったか

データベースの肥大化に悩んでいる人はぜひご協力お願いします!!!

○ こちらでの検証結果データをわかりやすく可視化して欲しい

2つめのお願いです。前述の表を含む検証結果のデータを、効果がわ
かりやすくなるように可視化してもらえないでしょうか?リリース
アナウンスなどで使いたいです。

CSVと各CSVの説明をまとめたものを↓におきました。よろしくお願
いします!

  http://packages.groonga.org/tmp/ja-segragate-size.tar.gz


○ 付録: このパラメーターを変えることで変わる挙動の詳細

(何か機会があったら説明します。。。)

-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)

Groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コミットへのコメントサービスはじめました:
  http://www.clear-code.com/services/commit-comment.html




groonga-dev メーリングリストの案内
Back to archive index