tak_kaz24****@yahoo*****
tak_kaz24****@yahoo*****
2016年 10月 18日 (火) 15:02:04 JST
10/13に「PGroongaの検索で大量件数該当時のエラーについて」の件名で問合せした高橋です。 以下のような事象が発生していますのでお手数ですが回答願えますでしょうか。 ■環境 10/13問合せ時と同一環境 ※Index Only Scanオプションは無効化済 ■現象 テーブルに1万件程度データを格納し、検索に該当したデータをスコア順でソートするため、 以下のようなSQLでpgroonga.score関数を利用しスコア順のソートを実行すると、 200件以上検索該当するあたりから「このコマンドを実行するのに十分な記憶域がありません」のエラーが発生し、 返却されるスコアが0になったり、結果が返却されなかったりPostgreSQLから切断されたりといった事象が発生し、 最悪out of memoryエラーとなりPostgreSQLの再起動が必要となります。 検索該当100件以下程度ですと発生しないようです。 ■実行したSQLの例 SELECT COLUMN1, pgroonga.score(CONTENT) AS SCORE_POINT FROM SCHEMA_NAME.CONTENT WHERE DOCUMENT_DATA @@ #SearchKeyword# ORDER BY SCORE_POINT DESC ※COLUMN1カラムがBIGSERIAL型。以下のpgroongaのインデックスを設定し、#SearchKeyword#に実際の検索語を設定 ■テーブル定義 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_SCORE_PGR_IDX ON SCHEMA_NAME.CONTENT USING pgroonga(COLUMN1, DOCUMENT_DATA); ■pgroonga.log(一部抜粋) 2016-10-18 13:28:17.641000|A| calloc fail (4194304)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:1497) <22000> 2016-10-18 13:28:17.641000|C| mmap failed!!!! in GRN_IO_SEG_REF(00000001AB04B1C0, 1): このコマンドを実行するのに十分な記憶域がありません。 ---上記2行と同内容が4行程度続く--- 2016-10-18 13:28:17.641000|A| calloc fail (49536)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:381) <22003> 2016-10-18 13:28:17.641000|e| grn_io_create_with_array failed ---上記2行と同内容が500行程度続く--- 2016-10-18 13:28:17.641000|e| [table][cursor][next] invalid cursor ---以下のようなログも300行ほど発生--- 2016-10-18 13:28:18.438000|A| calloc fail (148224)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:234) <22141> 2016-10-18 13:28:18.438000|A| calloc fail (148224)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:234) <22148> 2016-10-18 13:28:18.454000|e| [table][cursor][next] invalid cursor ■対応内容 前回問い合わせ時の仮想メモリ設定に加えてpostgresql.confのメモリ関連の設定を以下のように修正してみましたが改善されませんでした。 shared_buffers = 1GB work_mem = 32MB maintenance_work_mem = 128MB effective_cache_size = 2GB 何か有効な対処方法等ありましたらご教示願えますでしょうか。 もしくはpgroonga.score関数の制限がありましたら教えてください(大量件数の制限やBIGSERIAL型は対象外等)。