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

Zurück zum Archiv-Index

tak_kaz24****@yahoo***** tak_kaz24****@yahoo*****
2016年 10月 14日 (金) 14:12:02 JST


須藤様。高橋です。回答ありがとうございます。
メモリ不足が原因とのことで了解しました。

ログに関しては転送に制限のある環境ですので一部抜粋しています。
ご指摘のようにmalloc failも出力されていました。
テーブルのカラム数に関しては8カラムでpgroongaのインデックスはTEXT型の1カラムのみ設定しています。
TEXT型には日本語の文章が入るのでそれなりに大きいサイズとなります(大きいデータで100KB程度)。

■テーブル定義
CREATE TABLE SCHEMA_NAME.CONTENT ( 
   COLUMN1    BIGSERIAL    PRIMARY KEY,
   COLUMN2    TEXT          NOT NULL,
   COLUMN3    TEXT        NOT NULL,
   COLUMN4    VARCHAR(10)    NOT NULL,
   COLUMN5    INTEGER        NOT NULL,
   COLUMN6    TIMESTAMP    NOT NULL,
   COLUMN7        VARCHAR(30)    NOT NULL,
   DOCUMENT_DATA    TEXT        NOT NULL
);

■インデックス定義
CREATE INDEX CO_DOCUMENT_DATA_PGR_IDX    ON SCHEMA_NAME.CONTENT    USING pgroonga(DOCUMENT_DATA);

■pgroonga.log(一部抜粋)
2016-10-12 12:05:01.493000|A| calloc fail (4194304)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:1497) <22671>
2016-10-12 12:05:01.493000|C| mmap failed!!!! in GRN_IO_SEG_REF(00000003281E0C00, 0): このコマンドを実行するのに十分な記憶域がありません。
---上記2行と同内容が10行程度続く---
2016-10-12 12:05:01.508000|A| calloc fail (4194304)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:1497) <22741>
2016-10-12 12:05:01.508000|C| mmap failed!!!! in GRN_IO_SEG_REF(0000000328191A00, 0): このコマンドを実行するのに十分な記憶域がありません。
2016-10-12 12:05:01.508000|A| malloc fail (32768)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\expr.c:276) <22740>
2016-10-12 12:05:01.508000|e| malloc failed
2016-10-12 12:05:01.508000|e| obj not assigned for GRN_OP_PUSH

仮想メモリに関しては以下を参考に最少6140、最大12300にしてみましたが事象が改善されませんでした。
ただこの対応をしたためなのかpgroonga.logにエラーが出力されなくなりましたね・・・
SQLがエラーになるのは変わりませんが。

https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=013838

検索語を変更してSQLを実行しても以下のバイト数が変わらないのでメモリ関連ではないのかもしれません。

ERROR: index row requires 32920 bytes, maximum size is 8191
SQLステート:54000

速度劣化については大量件数で計測していないですが概算で10%程度でしょうか。
大幅な劣化ではないので当面Index Only Scanを無効にして様子を見てみます。
もし他に何かわかりましたらご連絡ください。よろしくお願いします。

--- kou****@clear***** wrote --- :
> 須藤です。
> 
> 報告ありがとうございます。
> 
> 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 mailing list
> groon****@lists*****
> http://lists.osdn.me/mailman/listinfo/groonga-dev
> 




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index