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/