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