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