<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"><<a href="mailto:kou****@clear*****" target="_blank">kou****@clear*****</a>></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->impl->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->implのサイズが増えるというのがあるんですが、<br>
すでにmrubyのインタプリターがいるのでそこはあまり気になら<br>
ないかなぁという感じです。<br>
<br>
<br>
どういうやり方がよさそうでしょうか?<br>
<br>
<br>
--<br>
須藤 功平 <<a href="mailto:kou****@clear*****">kou****@clear*****</a>><br>
株式会社クリアコード <<a href="http://www.clear-code.com/" rel="noreferrer" target="_blank">http://www.clear-code.com/</a>><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>