[groonga-dev,03076] [ANN] Groonga 4.1.1

Back to archive index

HAYASHI Kentaro hayas****@clear*****
2015年 1月 29日 (木) 12:51:18 JST


今日は肉の日(1/29)ですね。Groonga 4.1.1をリリースしました!

  http://groonga.org/ja/docs/news.html#release-4-1-1

それぞれの環境毎のインストール方法はこちらを見てください。
  http://groonga.org/ja/docs/install.html

今回のリリースの主なトピックは次の通りです。

* [実験的] Windowsでデータベースの初期サイズをよりコンパクトに
* drilldownで集計しやすくなりました
* groonga-httpdでdumpをストリーム処理できるように
* [実験的] マルチスレッドでのパフォーマンス改善

実験的な機能については、試してみてどうだったかを教えてもらえると
それをもとにデフォルトにするかどうか判断できるので助かります。

○ [実験的] Windowsでデータベースの初期サイズをよりコンパクトに

今回のリリースでは、データベースの初期サイズを小さくできるようにしました。

これまで、WindowsではUNIXとは異なりかなりサイズが大きい初期ファイル(128MiB)を
デフォルトで使っていました。

このデータベースファイルはカラムを作れば作るだけ増えていくので、登録しているデータが
少ない場合にはかなり無駄な領域があることになります。

これはあまり嬉しくないので、WindowsでもGNU/Linux環境と同じように必要に応じて
追加していくように挙動を変更できるようにしました。

以下のメールに詳しいことが書いてあります。

  [groonga-dev,03036] Windowsでの動作確認のお願い
  http://sourceforge.jp/projects/groonga/lists/archive/dev/2014-December/003038.html

ただし、デフォルトでは有効にしていません。まだ実験的な機能だからです。

この機能を有効にするには GRN_IO_VERSION=1 環境変数を指定してください。

Windowsを使っている人は、この機能を有効にして使ってみてどうだったかを教えてもらえると嬉しいです。
安定して動いているよ、という声が増えてきたら、デフォルトで有効にします。

試す際、GRN_IO_VERSION=1を有効にすると古いGroongaではそのデータベースを開けなくなる
ことにだけ注意してください。

○ drilldownで集計しやすくなりました

今回のリリースでは、drilldownで集計しやすくなりました。

drilldownの構文には以下の2つの種類がありますが、

* drilldown
* drilldown(ラベルつき)

今回機能拡張したのはdrilldown(ラベルつき)についてです。
drilldownした結果をグループごとにSUM (合計)、 MIN (最小値)、 MAX (最大値)、 AVG (平均) を
算出できるようになりました。

次の引数をselectコマンドに渡します。

  --drilldown[${LABEL}].calc_types=(算出方法) --drilldown[${LABEL}].calc_target=(対象カラム)

具体的な例をみてみましょう。MAXを使ってグループごとの最大値を取得する例です。

  table_create Tags TABLE_PAT_KEY ShortText
  
  table_create Memos TABLE_HASH_KEY ShortText
  column_create Memos tag COLUMN_SCALAR Tags
  column_create Memos priority COLUMN_SCALAR Int64
  
  load --table Memos
  [
  {"_key": "Groonga1", "tag": "Groonga", "priority": 10},
  {"_key": "Groonga2", "tag": "Groonga", "priority": 20},
  {"_key": "Groonga3", "tag": "Groonga", "priority": 40},
  {"_key": "Mroonga1", "tag": "Mroonga", "priority": 50},
  {"_key": "Mroonga2", "tag": "Mroonga", "priority": 25},
  {"_key": "Mroonga3", "tag": "Mroonga", "priority": 10},
  {"_key": "Rroonga1", "tag": "Rroonga", "priority": 25},
  {"_key": "Rroonga2", "tag": "Rroonga", "priority": -25},
  {"_key": "Rroonga3", "tag": "Rroonga", "priority": 0}
  ]
  
  select Memos \
    --limit 0 \
    --drilldown[tag].keys tag \
    --drilldown[tag].calc_types MAX \
    --drilldown[tag].calc_target priority \
    --drilldown[tag].output_columns _key,_max
  
結果は次のようになります。

    {
      "tag": [
        [
          3
        ],
        [
          [
            "_key",
            "ShortText"
          ],
          [
            "_max",
            "Int64"
          ]
        ],
        [
          "Groonga",
          40
        ],
        [
          "Mroonga",
          50
        ],
        [
          "Rroonga",
          25
        ]
      ]
    }

3つにグループ化され、タグとグループごとの最大値が返ってくるのがわかります。
最大値だけでなく最小値も取得したいなら、calc_typesに複数カンマ区切りで指定します。

  --drilldown[tag].calc_types MAX,MIN 

output_columnsに_min疑似カラムの指定も忘れないようにしましょう。

   --drilldown[tag].output_columns _key,_max,_min

これで、最大値と最小値をグループ化した結果ごとに取得できます。

○ [実験的] マルチスレッドでのパフォーマンス改善

今回のリリースでは、マルチスレッドでのパフォーマンス改善のための仕組みを実験的に入れました。

具体的には、--with-jemallocをつけてGroongaをビルドするとメモリアロケーションの実装に
jemallocを使うようにしました。

これを有効にすると、groongaコマンド や Mroonga でパフォーマンスを改善できるでしょう。
ただし、groonga-httpd は別です。groonga-httpd はマルチスレッドではなく、
マルチプロセスモデルで動作しているためです。

Groongaをビルドしなおすのはつらい、という人はLD_PRELOAD環境変数にjemallocのパスを
明示的に指定してGroongaを実行してみてください。

  LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1 groonga

試してみて、どれくらいパフォーマンスを改善できたかレポートしてくれると嬉しいです。

○ groonga-httpdでdumpをストリーム処理できるように

今回のリリースでは、groonga-httpdでdumpをストリーム処理できるようになりました。

  Groongaのdumpとgrndumpのメモリ消費の違い
  http://qiita.com/orangain/items/6abb3e3b4e0353419fde

上記はgroongaコマンドとgrndumpの比較ですが、groonga-httpdでストリーム処理ができるようになったので、
メモリが足りなくなってdumpできないという状況は改善されました。

単にdumpしたいだけならgroonga-httpdでもできます。もっとdumpする内容をカスタマイズしたい
というときにはgrndumpがおすすめです。

○ 変更点

さて、4.1.0からの変更点は以下の通りです。
  http://groonga.org/ja/docs/news.html#release-4-1-1

改良

  * [windows] エラーコードのかわりにエラーメッセージを表示するようにしました。
    これによりエラーがわかりやすくなります。
  * [実験的][windows] データベースの初期サイズを小さくできるようにしました。
    以前のバージョンではUNIXとは異なりかなりサイズが大きい初期ファイルをデフォルトで使っていました。
    この機能を有効にするには GRN_IO_VERSION=1 環境変数を指定します。
    まだ実験的な機能なためデフォルトでは有効にしていません。
  * drilldownで SUM (合計)、 MIN (最小値)、 MAX (最大値)、 AVG (平均) を
    算出する機能を使えるようにしました。この機能はラベルつきのdrilldown構文を拡張することで実現しています。
    drilldown_calc_types に SUM、 MIN、 MAX もしくは AVG を指定します。
    対象となるカラムは drilldown_calc_target として指定します。返り値はdrilldownによるグループ化した
    結果から算出されます。
  * [実験的] --with-jemalloc オプションを指定すると malloc()/free() に jemalloc の実装を
    使えるようになりました。マルチスレッドでのパフォーマンス改善が見込めます。
    例えば、groongaコマンド や Mroonga でパフォーマンスを改善できるでしょう。
    groonga-httpd は別で、groonga-httpd はマルチスレッドではなく、マルチプロセスモデルで動作しているためです。
  * groonga-httpd: 2048バイトを越える越えるエラーメッセージをサポートしました。この変更により、2048バイトを
    越えてもエラーメッセージが途中で切られることはありません。
  * groonga-httpd: dumpをストリーム処理できるようになりました。

修正

  * エラー発生時のエラーコードとエラーメッセージが strerror() を呼んで失敗したときに
    一致しない不具合を修正しました。このせいで、syscallエラーとして不適切なエラーコードを表示することがありました。
  * 未定義エラーが発生したときにエラーメッセージにエラーコード(errno)を表示するようにしました。
  * [windows] 適切なエラーコードを返すようにしました。
  * セクションを指定したマルチカラムインデックスだけが match_columns に指定されているときに、
    検索結果が正しくないという不具合を修正しました。例えば、 memo_index という title カラムと
    content カラムを対象としたマルチカラムインデックスがあるとします。
    この不具合は memo_index[0] というように 0番目のセクションであるtitle カラムのインデックスが
    match_columns に指定されている場合に発生します。
  * mecab: MeCab 0.993で発生する mecab_strerror(NULL) に対する回避策を追加しました。
    この修正がないとMeCabの辞書がない場合にGroongaが強制終了します。 [田沼さんが報告]
  * groonga-httpd: カスタムログの指定が無視される不具合を修正しました。
  * groonga-httpd: データベースが空の状態でdumpすると返ってこない不具合を修正しました。

感謝

  * 田沼修平さん

-- 
HAYASHI Kentaro <hayas****@clear*****>




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