[groonga-dev,03475] 1回のコマンド実行中は生きつづけるオブジェクトを管理できる仕組みが欲しい

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 9月 5日 (土) 00:18:33 JST


須藤です。

森さんに相談です。

  [groonga-dev,03423] groonga-clientのタイムアウト値と、遅いク
  エリについて

のスレッドの

  https://osdn.jp/projects/groonga/lists/archive/dev/2015-August/003430.html

あたりのことを解決したいと思っています。

↑はざっくり言うと、10000万件のレコードに対して
html_highlight()(はてなキーワードの自動リンクみたいなやつ)
すると遅い、理由は、html_highlight()するごとにpatを新しく作っ
てそこにキーワードを詰めているから、という感じです。

解決策として、コマンド実行中はpatを使いまわす、というのを考
えていて、それを実現する仕組みはどういうのがいいかを相談した
いです。

私は次のような方法を考えています。

1. grn_expr_add_var()で自分で作ったgrn_objを登録しておいて、
   grn_expr_clear_vars()のときに解放するようにする。

   GRN_BULKは↑でいけるんですが、patはいけません。なぜなら、
   grn_expr_add_var()は自分でgrn_objをアロケートするので、呼
   び出し側がアロケートしたpatをgrn_expr_clear_vars()対象に
   できないからです。

   そこで、GRN_PTRにフラグを追加して、そのフラグが立っている
   ときはGRN_PTRをcloseしたときにGRN_PTRが参照している
   grn_objもcloseするというのはどうかと考えています。

   https://github.com/groonga/groonga/commit/599af4ac79415eddb28a03a8c19dab0b7e26d843

   という感じです。

   メリットは自然な気がするというところです。

   デメリットはgrn_objにしか使えない仕組みというのとフラグの
   場所がもったいないというところです。

2. ctx->impl->expr_vars相当のものをもうひとつ用意して、
   grn_obj以外も1コマンド実行中に生きていられる仕組みを作る。

   grn_expr_add_obj(grn_ctx *ctx,
                    const char *name,
                    void *object,
                    void(*free_func)(void *object);

   のような感じで解放する関数も一緒に登録しておけるようにし
   ます。

   grn_expr_clear_vars()を呼ぶタイミングで↑で登録したオブジェ
   クトを解放します。

   メリットはgrn_obj以外にも対応できるところです。

   デメリットはAPIが増えることと複雑になってアレだなぁという
   ところです。(varとobjで別々の名前空間を使うところとか。)
   あとは、ctx->implのサイズが増えるというのがあるんですが、
   すでにmrubyのインタプリターがいるのでそこはあまり気になら
   ないかなぁという感じです。


どういうやり方がよさそうでしょうか?


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

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




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