<div dir="ltr">1.がいいんじゃないでしょうか!<div>理由は自然な感じがするからです!</div><div>1bitフラグに使うのはもったいないという考え方もありますが、</div><div>これによって消費メモリが増えるわけでもないので良いのかなーと思います。</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-09-05 0:18 GMT+09:00 Kouhei Sutou <span dir="ltr">&lt;<a href="mailto:kou****@clear*****" target="_blank">kou****@clear*****</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">須藤です。<br>
<br>
森さんに相談です。<br>
<br>
  [groonga-dev,03423] groonga-clientのタイムアウト値と、遅いク<br>
  エリについて<br>
<br>
のスレッドの<br>
<br>
  <a href="https://osdn.jp/projects/groonga/lists/archive/dev/2015-August/003430.html" rel="noreferrer" target="_blank">https://osdn.jp/projects/groonga/lists/archive/dev/2015-August/003430.html</a><br>
<br>
あたりのことを解決したいと思っています。<br>
<br>
↑はざっくり言うと、10000万件のレコードに対して<br>
html_highlight()(はてなキーワードの自動リンクみたいなやつ)<br>
すると遅い、理由は、html_highlight()するごとにpatを新しく作っ<br>
てそこにキーワードを詰めているから、という感じです。<br>
<br>
解決策として、コマンド実行中はpatを使いまわす、というのを考<br>
えていて、それを実現する仕組みはどういうのがいいかを相談した<br>
いです。<br>
<br>
私は次のような方法を考えています。<br>
<br>
1. grn_expr_add_var()で自分で作ったgrn_objを登録しておいて、<br>
   grn_expr_clear_vars()のときに解放するようにする。<br>
<br>
   GRN_BULKは↑でいけるんですが、patはいけません。なぜなら、<br>
   grn_expr_add_var()は自分でgrn_objをアロケートするので、呼<br>
   び出し側がアロケートしたpatをgrn_expr_clear_vars()対象に<br>
   できないからです。<br>
<br>
   そこで、GRN_PTRにフラグを追加して、そのフラグが立っている<br>
   ときはGRN_PTRをcloseしたときにGRN_PTRが参照している<br>
   grn_objもcloseするというのはどうかと考えています。<br>
<br>
   <a href="https://github.com/groonga/groonga/commit/599af4ac79415eddb28a03a8c19dab0b7e26d843" rel="noreferrer" target="_blank">https://github.com/groonga/groonga/commit/599af4ac79415eddb28a03a8c19dab0b7e26d843</a><br>
<br>
   という感じです。<br>
<br>
   メリットは自然な気がするというところです。<br>
<br>
   デメリットはgrn_objにしか使えない仕組みというのとフラグの<br>
   場所がもったいないというところです。<br>
<br>
2. ctx-&gt;impl-&gt;expr_vars相当のものをもうひとつ用意して、<br>
   grn_obj以外も1コマンド実行中に生きていられる仕組みを作る。<br>
<br>
   grn_expr_add_obj(grn_ctx *ctx,<br>
                    const char *name,<br>
                    void *object,<br>
                    void(*free_func)(void *object);<br>
<br>
   のような感じで解放する関数も一緒に登録しておけるようにし<br>
   ます。<br>
<br>
   grn_expr_clear_vars()を呼ぶタイミングで↑で登録したオブジェ<br>
   クトを解放します。<br>
<br>
   メリットはgrn_obj以外にも対応できるところです。<br>
<br>
   デメリットはAPIが増えることと複雑になってアレだなぁという<br>
   ところです。(varとobjで別々の名前空間を使うところとか。)<br>
   あとは、ctx-&gt;implのサイズが増えるというのがあるんですが、<br>
   すでにmrubyのインタプリターがいるのでそこはあまり気になら<br>
   ないかなぁという感じです。<br>
<br>
<br>
どういうやり方がよさそうでしょうか?<br>
<br>
<br>
--<br>
須藤 功平 &lt;<a href="mailto:kou****@clear*****">kou****@clear*****</a>&gt;<br>
株式会社クリアコード &lt;<a href="http://www.clear-code.com/" rel="noreferrer" target="_blank">http://www.clear-code.com/</a>&gt;<br>
<br>
Groongaベースの全文検索システムを総合サポート:<br>
  <a href="http://groonga.org/ja/support/" rel="noreferrer" target="_blank">http://groonga.org/ja/support/</a><br>
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:<br>
  <a href="http://www.clear-code.com/recruitment/" rel="noreferrer" target="_blank">http://www.clear-code.com/recruitment/</a><br>
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:<br>
  <a href="http://www.clear-code.com/services/code-reader/" rel="noreferrer" target="_blank">http://www.clear-code.com/services/code-reader/</a><br>
<br>
_______________________________________________<br>
groonga-dev mailing list<br>
<a href="mailto:groon****@lists*****">groon****@lists*****</a><br>
<a href="http://lists.osdn.me/mailman/listinfo/groonga-dev" rel="noreferrer" target="_blank">http://lists.osdn.me/mailman/listinfo/groonga-dev</a><br>
</blockquote></div><br></div>