[groonga-dev,03739] Re: groonga検索時にrc=-35のエラーが発生する

Back to archive index

Susumu Yata yata****@razil*****
2015年 12月 9日 (水) 13:22:37 JST


佐藤様

矢田です.

ひとまず, 500 個までに制限していただけるのであれば,
OR や AND でつなぐ単純なクエリなら問題ないはずです.

今回の修正は,スタックを拡張可能にしたのではなく,
GRN_STACK_SIZE をサイズとして使っていた領域のひとつを拡張可能にしただけです.
残念ながら, OR や AND をさらに増やしていくと,どこかでほかの制限に引っかかります.

実際に試してみたところ, 1,024 個目でエラーになりました.
1,000 よりもう少し頑張っていれば気づけていたのですが….

[[-63,1449634203.23089,0.00215721130371094,"stack under flow in relative op",
 [["grn_expr_append_obj","expr.c",938],...

せっかくなので,もう少し調べてみます.

2015年12月9日 11:29 Hiroyuki Sato <hiroy****@gmail*****>:
> 矢田様
>
> 佐藤です。
>
> ご連絡をありがとうございます。
> 今回の修正では、スタック?が不足したら拡張をするので、理論上はメモリが許す限り
> ORでもANDでも使えるようになる(はず)
> ということでよかったでしょうか?
>
> システムの制限は上記としても、利用上の制限でORで利用できるのは500個までとか決めておこうと思います。
>
> ありがとうございました。
>
>
>
>
> 2015年12月9日(水) 11:24 Susumu Yata <yata****@razil*****>:
>>
>> 佐藤様
>>
>> 矢田です.
>>
>> 古いバージョンで確認してみました.
>> 例として挙げられている '-', '()' については以下のようになりました.
>>
>> * -: OR を - に置き換えても 256 個目で "stack is full" が出ます.
>> * (): OR 255 個の途中に () を挿入しても問題は起きません.
>>
>> 一方で, AND については半分の 128 個で "stack is full" になりました.
>>
>> 実際に必要とされる領域のサイズは,クエリの内部表現に依存します.
>> `--query` に出現するカラムや定数も領域を消費する上に,
>> `--query` では省略できる要素も計上されるはずなので,
>> 具体的にいくつまでという数字を示すことは難しいです.
>>
>> ひとまず,古いバージョンでもオペレータ 100 個くらいであれば大丈夫そうです.
>>
>> はっきりした回答ができなくて申し訳ありませんが,以上です.
>>
>> 2015年12月9日 9:26 Hiroyuki Sato <hiroy****@gmail*****>:
>> > 矢田様
>> >
>> > 佐藤です。
>> > 早速のご対応ありがとうございます。
>> > 大変助かります。
>> > こちらでもテストをしたいと思います。
>> >
>> > ちなみに256個の制限というのはORだけでなく「-」や「()」などの
>> > オペレータ?の数が256個ということで良いでしょうか?
>> >
>> > よろしくお願いします。
>> >
>> > 2015年12月8日(火) 23:40 Susumu Yata <yata****@razil*****>:
>> >>
>> >> 矢田です.
>> >>
>> >> 本件でサイズ不足が発生する領域を動的に拡張するよう修正してみました.
>> >>
>> >> - grn_expr: dynamically resize expr->codes · groonga/groonga @ 7bb4f6e
>> >>  -
>> >>
>> >> https://github.com/groonga/groonga/commit/7bb4f6eb7aed9bb68c003b3c283505bc3444d16c
>> >>
>> >> 手元で試した限りでは, OR を 1,000 個含むクエリでも問題なく実行できました.
>> >> 修正前は OR を 256 個含むクエリで "stack is full " になっていました.
>> >>
>> >> 対応する GitHub Issue は以下です.
>> >>
>> >> - A query with a lot of ORs fails · Issue #443 · groonga/groonga
>> >>  - https://github.com/groonga/groonga/issues/443
>> >>
>> >> よろしくお願いします.
>> >>
>> >> 2015年12月7日 22:47 Hiroyuki Sato <hiroy****@gmail*****>:
>> >> > 佐藤です。
>> >> >
>> >> > 要望というか希望です。
>> >> > もしSTACK_SIZEの変更が必要であれば自分でコンパイルするのは面倒なので、
>> >> > 設定で変更できると良いと思います。
>> >> > (とはいえORが512ぐらい指定できれば十分なんですが、そんな使い方他の人しませんよね。)
>> >> >
>> >> > やっていることはhighlight_htmlを適用する文字の指定です。
>> >> >
>> >> > 他の方法で良いのがあればそちらにしようと思います。
>> >> > 下記は簡略化していますが、"きもの"はハイライトしたいが、"はきもの"は除外したい
>> >> > ということをするために
>> >> >
>> >> > ( きもの - はきもの) OR ( 別キーワード) ..というようなことをしております。
>> >> > キーワードがよく変わるのでGroonga内で永続化せずに実現できるといいなと思っています。
>> >> > なにか良いアドバイスをいただけると助かります。
>> >> >
>> >> > よろしくお願いします。
>> >> >
>> >> >   select \
>> >> >     --table Data \
>> >> >     --match_columns article \
>> >> >     --output_columns "_key,highlight_html(article),line_no" \
>> >> >     --query "( あいこ OR あかり OR ありま OR いつお OR うらら OR かおり OR かとう OR かなえ
>> >> > OR
>> >> > かなめ
>> >> > OR きよこ OR きよみ OR こずえ OR しげこ OR すずき  OR せいこ OR せんだ OR たいじ OR たけお OR
>> >> > たまえ
>> >> > OR
>> >> > ちゃん OR ちょこ OR とよこ OR ながの OR のぼる OR のむら OR まこと OR みどり OR みやこ OR みゆき OR
>> >> > よしの OR
>> >> > よしみ OR 健次郎 OR 利根川 OR 千々石 OR 千鶴子 OR 大久保 OR 大河原 OR 威海衛 OR 宇都宮 OR 小石川 OR
>> >> > 江田島 OR
>> >> > 海江田 OR 西久保 OR 高千穂 OR こうへい OR こうめい ) OR (line_no:>1 + line_no:<500)" \
>> >> >     --command_version 2 \
>> >> >     --limit -1
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > 2015年12月7日(月) 18:19 Hiroyuki Sato <hiroy****@gmail*****>:
>> >> >>
>> >> >> 矢田様
>> >> >>
>> >> >> 佐藤です。
>> >> >> お世話になっております。
>> >> >>
>> >> >> 2015年12月7日(月) 18:00 Susumu Yata <yata****@razil*****>:
>> >> >>>
>> >> >>> 矢田です.
>> >> >>>
>> >> >>> ご報告ありがとうございます.
>> >> >>>
>> >> >>> エラーメッセージを参考にソースコードを辿ってみたところ, OR の個数が原因のようです.
>> >> >>>
>> >> >>> [[-35,1449474361.23027,0.00206923484802246,"stack is
>> >> >>> full",[["grn_expr_append_obj","expr.c",751]]],[]]
>> >> >>>
>> >> >>> 検索条件を構成する要素が多すぎるために,固定サイズの領域が埋まってしまったようです.
>> >> >>
>> >> >>
>> >> >> やはり個数ですか、、、
>> >> >> ORの個数こんなに増えて大丈夫かな???とは思っていました。
>> >> >>
>> >> >>
>> >> >>>
>> >> >>> // expr.c
>> >> >>> if (e->codes_curr >= e->codes_size) {
>> >> >>>   ERR(GRN_NO_MEMORY_AVAILABLE, "stack is full");
>> >> >>>   goto exit;
>> >> >>> }
>> >> >>>
>> >> >>> // expr.c
>> >> >>> int size = GRN_STACK_SIZE;
>> >> >>> ...
>> >> >>> expr->codes_size = size;
>> >> >>>
>> >> >>> // config.h
>> >> >>> /* stack size */
>> >> >>> #define GRN_STACK_SIZE 1024
>> >> >>>
>> >> >>> 一応,この値はビルド時に指定できるみたいです.
>> >> >>> コミットメッセージには "This is DANGER parameter!!!" と書かれていますが….
>> >> >>
>> >> >>
>> >> >> しかしさすがに1024は使っていないように思うのですが、
>> >> >> ユーザが利用可能な数は、いくつになるかおわかりでしょうか?
>> >> >>
>> >> >> さすがにDANGERとかいてあるパラメータを変更するのは
>> >> >> 気が引けますね。
>> >> >>
>> >> >> 倍あれば当面こまらなそうなんですが、、
>> >> >> なにか別の検索方法を探る必要がありますね。
>> >> >>
>> >> >> ありがとうございました。
>> >> >>
>> >> >>
>> >> >>>
>> >> >>>
>> >> >>> - Make GRN_STACK_SIZE customizable on build ·
>> >> >>> groonga/groonga @ 1162623
>> >> >>>  -
>> >> >>>
>> >> >>>
>> >> >>> https://github.com/groonga/groonga/commit/116262374751a91318c4815e9a293aeeaf98cfbb
>> >> >>>
>> >> >>> 2015年12月7日 16:52 Hiroyuki Sato <hiroy****@gmail*****>:
>> >> >>> > 手動でコマンドを実行したら
>> >> >>> >
>> >> >>> > [[-35,1449474361.23027,0.00206923484802246,"stack is
>> >> >>> > full",[["grn_expr_append_obj","expr.c",751]]],[]]
>> >> >>> >
>> >> >>> > となりました。
>> >> >>> > ORの個数?、クエリの長さ?を減らすと大丈夫なようです。
>> >> >>> >
>> >> >>> > よろしくお願いします。
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > 2015年12月7日(月) 16:19 Hiroyuki Sato <hiroy****@gmail*****>:
>> >> >>> >>
>> >> >>> >> 佐藤です。
>> >> >>> >>
>> >> >>> >> 質問です。
>> >> >>> >>
>> >> >>> >> 1, rc=-35のエラー
>> >> >>> >>
>> >> >>> >>  groongaで検索をしていて次のエラーが発生しました。
>> >> >>> >>
>> >> >>> >>    2015-12-07 15:26:13.929059|0x7fee80d71d10|:000000000834456
>> >> >>> >> select(0)
>> >> >>> >>    2015-12-07 15:26:13.929103|0x7fee80d71d10|<000000000878385
>> >> >>> >> rc=-35
>> >> >>> >>
>> >> >>> >>  rc=-35とは、メモリ不足だと思うのですが、
>> >> >>> >>  なにか設定でこの容量を増やすことはできますでしょうか?
>> >> >>> >>
>> >> >>> >>  include/groonga/groonga.h
>> >> >>> >>    GRN_NO_MEMORY_AVAILABLE = -35,
>> >> >>> >>
>> >> >>> >> 2, やっていることは
>> >> >>> >>
>> >> >>> >>   https://github.com/hiroyuki-sato/groonga-highlight_test#クエリ
>> >> >>> >>   とほぼ同じです。ただし、ORの数が252個ぐらいあります。
>> >> >>> >>
>> >> >>> >>   select \
>> >> >>> >>     --table Data \
>> >> >>> >>     --match_columns article \
>> >> >>> >>     --output_columns "_key,highlight_html(article),line_no" \
>> >> >>> >>     --query "( あいこ OR あかり OR ありま OR いつお OR うらら OR かおり OR かとう OR
>> >> >>> >> かなえ
>> >> >>> >> OR
>> >> >>> >> かなめ
>> >> >>> >> OR きよこ OR きよみ OR こずえ OR しげこ OR すずき  OR せいこ OR せんだ OR たいじ OR たけお
>> >> >>> >> OR
>> >> >>> >> たまえ
>> >> >>> >> OR
>> >> >>> >> ちゃん OR ちょこ OR とよこ OR ながの OR のぼる OR のむら OR まこと OR みどり OR みやこ OR
>> >> >>> >> みゆき
>> >> >>> >> OR
>> >> >>> >> よしの OR
>> >> >>> >> よしみ OR 健次郎 OR 利根川 OR 千々石 OR 千鶴子 OR 大久保 OR 大河原 OR 威海衛 OR 宇都宮 OR
>> >> >>> >> 小石川
>> >> >>> >> OR
>> >> >>> >> 江田島 OR
>> >> >>> >> 海江田 OR 西久保 OR 高千穂 OR こうへい OR こうめい ) OR (line_no:>1 +
>> >> >>> >> line_no:<500)"
>> >> >>> >> \
>> >> >>> >>     --command_version 2 \
>> >> >>> >>     --limit -1
>> >> >>> >>
>> >> >>> >> 3, 環境
>> >> >>> >>   OS: Scientific Linux 6 64bit
>> >> >>> >>  groonga: 5.0.8です。(正確にはhighlight_html修正済みの5.0.7-2)
>> >> >>> >>
>> >> >>> >>   vm.overcommit_memroyは1にしてあります。
>> >> >>> >>   DBの格納されているサイズは280MBぐらいでそれほど容量が大きいわけではありません。
>> >> >>> >>
>> >> >>> >>   ファイルは32個ぐらいしか開いておらずファイルディスクリプタが足りないということ
>> >> >>> >>   もないようです。
>> >> >>> >>
>> >> >>> >> よろしくお願いします。
>> >> >>> >>
>> >> >>> >>
>> >> >>> >>
>> >> >>> >>
>> >> >>> >
>> >> >>> >
>> >> >>> > _______________________________________________
>> >> >>> > groonga-dev mailing list
>> >> >>> > groon****@lists*****
>> >> >>> > http://lists.osdn.me/mailman/listinfo/groonga-dev
>> >> >>> >
>> >> >>>
>> >> >>>
>> >> >>>
>> >> >>> --
>> >> >>> Susumu Yata <yata****@razil*****>
>> >> >>> _______________________________________________
>> >> >>> groonga-dev mailing list
>> >> >>> groon****@lists*****
>> >> >>> http://lists.osdn.me/mailman/listinfo/groonga-dev
>> >> >
>> >> >
>> >> > _______________________________________________
>> >> > groonga-dev mailing list
>> >> > groon****@lists*****
>> >> > http://lists.osdn.me/mailman/listinfo/groonga-dev
>> >> >
>> >>
>> >>
>> >>
>> >> --
>> >> Susumu Yata <yata****@razil*****>
>> >> _______________________________________________
>> >> groonga-dev mailing list
>> >> groon****@lists*****
>> >> http://lists.osdn.me/mailman/listinfo/groonga-dev
>> >
>> >
>> > _______________________________________________
>> > groonga-dev mailing list
>> > groon****@lists*****
>> > http://lists.osdn.me/mailman/listinfo/groonga-dev
>> >
>>
>>
>>
>> --
>> Susumu Yata <yata****@razil*****>
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> http://lists.osdn.me/mailman/listinfo/groonga-dev
>
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.osdn.me/mailman/listinfo/groonga-dev
>



-- 
Susumu Yata <yata****@razil*****>



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