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