[groonga-dev,04149] Re: PGroongaの検索で大量件数該当時のエラーについて

Back to archive index

Kouhei Sutou kou****@clear*****
2016年 10月 14日 (金) 00:08:43 JST


須藤です。

報告ありがとうございます。

In <91639****@web10*****>
  "[groonga-dev,04148] PGroongaの検索で大量件数該当時のエラーについて" on Thu, 13 Oct 2016 16:23:57 +0900 (JST),
  tak_kaz24****@yahoo***** wrote:

> ■実行したSQLの例
> SELECT unnest(pgroonga.snippet_html(DOCUMENT_DATA, ARRAY[#SearchKeyword#])) AS SNIPPET_STRING FROM TARGET_TABLE WHERE DOCUMENT_DATA @@ #SearchKeyword#
> ※DOCUMENT_DATAカラムにpgroongaのインデックスを設定し、#SearchKeyword#に実際の検索語を設定
> 
> ■SQL実行時のエラー
> ERROR: pgroonga: failed to allocate memory for generating snippet
> SQLステート:53200
> 
> ■pgroonga.log
> calloc fail (4194304)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:1497) <22767> 
> mmap failed!!!! in GRN_IO_SEG_REF(000000032560E4B0, 0): このコマンドを実行するのに十分な記憶域がありません。

pgroonga.logのログは本当にこれだけでしたか?
"malloc fail (..."というのがでているような気がするんです
が。。。

ログはタイムスタンプ付きだと思うので、タイムスタンプも省略せ
ずにつけてもらえると助かります。(クエリーを実行した時間もわ
かるとログと付き合わせられて捗ります。)


端的に言うとメモリーが不足しているのが原因なんですが、4GBの
メモリーを積んでいて300件しかレコードがないのに不足するとは
考えにくいです。ものすごくたくさんカラムがあってそれらに
PGroongaのインデックスを張っているとか、1つのレコードがもの
すごく大きいとかそういうことはありませんか?

テーブル定義・インデックス定義を提供してもらえると助かります。


もし、なにかがものすごくたくさんある場合はその分のメモリーが
必要です。割り当てるメモリーを増やすか、仮想メモリーを増やし
てください。(ページングファイルというもののサイズを大きくし
てください。)

仮想メモリーの増やし方ですが。。。Microsoftのサイトに設定方
法が書いてあった気がしたんですが見つけられませんでした。。。

> ■該当件数が多い場合にPostgreSQLインストールディレクトリのdata\pg_logに出力されるログ
> ERROR:  index row requires 32920 bytes, maximum size is 8191
> 
> SQLの実行計画を取得すると件数が少ない場合Bitmap Index Scanでpgroongaのインデックスを使用していますが、
> 多い場合Index Only Scanを使用しておりこの時に8191バイト制限を超過してエラーとなるようです。
> SET enable_indexonlyscan = offを実行してIndex Only Scanを無効にすると、
> Index Scanを使用するようになりエラーにならないため回避は可能ですが速度としては落ちるため、
> 何か有効な対処方法等ありましたらご教示願えますでしょうか。

これはPostgreSQLの制限なのでIndex Only Scanを無効にしてくだ
さい。。。

実行時にIndex Only Scanを無効にできればいいんですが、
PGroongaは検索実行前(検索結果を知る前)にPostgreSQLにIndex
Only Scanでいけるかどうかを返さないといけないので、ヒットし
たデータが制限サイズを超えるかどうかを判断できないんですよ
ねぇ。text型なら大きくなる可能性が高いのでIndex Only Scanを
無効にするとかはできるんですが、そうすると効果が減りそうなの
で現状の動作になっています。安全側に倒してIndex Only Scanを
無効にしたほうがいいんですかねぇ。。。


ちなみに、どのくらい速度が落ちますか?
私がDebian GNU/Linux上で実験していたときはそんなに有意に差が
でなかったので興味があります。


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

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
OSS開発支援サービス:
  http://www.clear-code.com/blog/2016/6/27.html




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