Closed kou closed 7 years ago
メモリー16GB+スワップ32GB+SSDの環境での結果。
PGroongaのインデックス作成時間がすごく遅かった。(約9.5時間。33869548.323 ms)
pg_trgmは約2.5時間(9308261.242 ms)
textsearchは文字列が長すぎてエラー。
textsearchのエラーは↓。(↑のログにある。)
ERROR: string is too long for tsvector (1618908 bytes, max 1048575 bytes)
DB 構築時間の参考になるかもしれないので,こちらに貼らせていただきます.
最新の Groonga にデータを投入するとき,およびに索引を静的構築するときのメモリ使用量を調べてみました.調査した環境は Ubuntu 16.04, RAM: 32GB,スワップなしで vm.overcommit_memory=0
です. DB は SSD 上に作成しました.
$ groonga --version
Groonga 6.1.0-16-g5ebb993 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,msgpack,mruby,onigmo,zlib,lz4,epoll]
configure options: < '--with-ruby=ruby' '--enable-mruby'>
構築された DB のサイズは 132GB でした.
$ du -h db
132G db
メモリー64GB+SSDの環境での結果。
日本語版Wikipedia全ページと英語版Wikipedia前ページの結果。りあえずテキストでまとめる。表にするとか見やすくするのは後で。
日本語版Wikipedia:
生データ:
データ:
データのロード時間:
データロード後のDBサイズ:
PGroongaインデックス作成時間:
PGroongaインデックスサイズ:(データ込み。zlib圧縮)
pg_bigmインデックス作成時間:
pg_bigmインデックスサイズ:
検索時間(同じ接続で5回連続で検索して1番速いやつ):
英語版Wikipedia:
生データ:
データ:
データのロード時間:
データロード後のDBサイズ:
PGroongaインデックス作成時間:
PGroongaインデックスサイズ:(データ込み。zlib圧縮)
pg_trgmインデックス作成時間:
pg_trgmインデックスサイズ:
textsearchインデックス作成時間:(本文全部を対象にすると失敗するので先頭1MBだけ)
textsearchインデックスサイズ:
検索時間(同じ接続で5回連続で検索して1番速いやつ):
日本語版のまとめ。
環境:
CPU | メモリー | スワップ | ストレージ | OS |
---|---|---|---|---|
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) | 64GiB | 35GiB | SSD(500GB) | CentOS 7.2 |
バージョン:
PostgreSQL | PGroonga | pg_bigm |
---|---|---|
9.6.1 | 1.1.8 | 1.2-20161011 |
データ:
サイズ | レコード数 | タイトルの平均バイト数 | 本文の平均バイト数 |
---|---|---|---|
約5.9GiB | 約90万件 | 約21.6B | 約6.7KiB |
データロード:
時間 | サイズ |
---|---|
約5分 | 約5GB |
インデックス作成:
種類 | 時間 | サイズ | 備考 |
---|---|---|---|
PGroonga | 約21分 | 約9.8GB | データもロードしている。データはzlibで圧縮している。 |
pg_bigm | 約40分 | 約4.2GB | maintenance_work_mem は512MB 。 |
検索:
pgroonga.command('select ...')
で実行したもの。クエリー:テレビアニメ
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約63ms | 約2万件 | 約1.7 |
Groonga | 約38ms | 約2万件 | 1 |
pg_bigm | 約2.8s | 約2万件 | 約74 |
クエリー:データベース
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約48ms | 約1.5万件 | 約1.6 |
Groonga | 約30ms | 約1.5万件 | 1 |
pg_bigm | 約1.3s | 約1.5万件 | 約43 |
クエリー:PostgreSQL OR MySQL
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約2ms | 316件 | 約2 |
Groonga | 約1ms | 316件 | 1 |
pg_bigm | 約47ms | 311件 | 約47 |
クエリー:日本
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約600ms | 約53万件 | 約11 |
Groonga | 約53ms | 約53万件 | 1 |
pg_bigm | 約504ms | 約53万件 | 約10 |
英語版のまとめ。
環境:
CPU | メモリー | スワップ | ストレージ | OS |
---|---|---|---|---|
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) | 64GiB | 35GiB | SSD(500GB) | CentOS 7.2 |
バージョン:
PostgreSQL | PGroonga |
---|---|
9.6.1 | 1.1.8 |
データ:
サイズ | レコード数 | タイトルの平均バイト数 | 本文の平均バイト数 |
---|---|---|---|
約33GiB | 約530万件 | 約19.6B | 約6.4KiB |
データロード:
時間 | サイズ |
---|---|
約26分 | 約21GB |
インデックス作成:
種類 | 時間 | サイズ | 備考 |
---|---|---|---|
PGroonga | 約1時間38分 | 約39GB | データもロードしている。データはzlibで圧縮している。インデックスのみだと約21GB。 |
pg_trgm | 約1時間52分 | 約7.8GB | maintenance_work_mem は512MB 。 |
textsearch | N/A | N/A | 「string is too long for tsvector (1618908 bytes, max 1048575 bytes)」というエラーがでてインデックスを作成できない。 |
textsearch(先頭1M文字のみ) | 約4時間12分 | 約11GB | maintenance_work_mem は512MB 。 |
検索:
pgroonga.command('select ...')
で実行したもの。クエリー:animation
種類 | 時間 | 件数 | 相対時間 | 備考 |
---|---|---|---|---|
PGroonga | 約176ms | 約4万件 | 約22 | |
Groonga | 約8ms | 約4万件 | 1 | |
pg_trgm | 約44s | 約3万件 | 約5500 | |
textsearch | 約1s | 約42万件 | 約125 | 件数が1桁多いのはステミングして「anim」で検索しているから |
クエリー:database
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約668ms | 約21万件 | 約37 |
Groonga | 約18ms | 約21万件 | 1 |
pg_trgm | 約33s | 約13万件 | 約1833 |
textsearch | 約649ms | 約19万件 | 約36 |
クエリー:PostgreSQL OR MySQL
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約4ms | 1636件 | 約1.3 |
Groonga | 約4ms | 1636件 | 約1.3 |
pg_trgm | 約227ms | 1484件 | 約57 |
textsearch | 約3ms | 1506件 | 1 |
クエリー:America
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約1.3s | 約47万件 | 約31 |
Groonga | 約42ms | 約47万件 | 1 |
pg_trgm | 約1m32s | 約141万件 | 約2190 |
textsearch | 約1.3s | 約48万件 | 約31 |
メモリ使用量について気になったので, RAM 128GB の環境で追試してみました. load によるデータ投入(索引なし)では,メモリ上にすべて収まるようです. 静的索引構築では約 50% まで増えて落ち着くようです.
RAM 32GB の環境でも 50% で頭打ちになっていたので, OS により 50% で制限されているのだと思います. 怪しいのは以下です.
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
ありがとうございます! 物理メモリーがあるともっとメモリーを使って頑張るということですね。
メモリー32GBの環境で再試した。再試の理由は英語版Wikipediaをコンテンツページだけにすると、1MiB未満のバイト数におさまりそうだったからである。おさまるならsubstringする必要はない。
で、substringなしにしてみたらエラーにならなかった。
また、maintenance_work_mem
をさらに増やすと効果があるかを測定するためである。512MBから2GBに増やしたがあまり変わらなかった。
PGroongaのインデックス構築時間がpg_trgmより遅かったのでそれは再測定する。理由は64GBの環境だとPGroongaの方が速かったからである。
静的索引構築時にPostgreSQLのメモリープールを細かく解放するようにしたら使用メモリーが素のGroongaと同じくらいになった。
PGroongaのインデックス作成時間を再測定した。5041785.782 ms(1時間24分)なので15分くらい速くなった。
↑↑にtextsearchの検索結果が入っていなかったのでそれも再測定した。
日本語版も再測定した。
maintenance_work_mem
を2GBにしたらpg_bigmのインデックス構築時間が速くなった。4o分→33分
PGroongaは多少速くなった。21分→18分
再:日本語版のまとめ。
環境:
CPU | メモリー | スワップ | ストレージ | OS |
---|---|---|---|---|
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) | 32GiB | 2GiB | SSD(500GB) | CentOS 7.2 |
バージョン:
PostgreSQL | PGroonga | pg_bigm |
---|---|---|
9.6.1 | 1.1.8+α | 1.2-20161011 |
データ:
サイズ | レコード数 | タイトルの平均バイト数 | タイトルの最長バイト数 | 本文の平均バイト数 | 本文の最長バイト数 |
---|---|---|---|---|---|
約5.9GiB | 約90万件 | 約21.6B | 250バイト | 約6.7KiB | 約677KiB |
データロード:
時間 | サイズ |
---|---|
約5分 | 約5GB |
インデックス作成:
種類 | 時間 | サイズ | 備考 |
---|---|---|---|
PGroonga | 約19分 | 約9.8GB | データもロードしている。データはzlibで圧縮している。 |
pg_bigm | 約33分 | 約4.2GB | maintenance_work_mem は2GB 。 |
検索:
pgroonga.command('select ...')
で実行したもの。クエリー:テレビアニメ
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約65ms | 約2万件 | 約1.1 |
Groonga | 約38ms | 約2万件 | 1 |
pg_bigm | 約2.8s | 約2万件 | 約48 |
クエリー:データベース
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約49ms | 約1.5万件 | 約1.6 |
Groonga | 約31ms | 約1.5万件 | 1 |
pg_bigm | 約1.3s | 約1.5万件 | 約41 |
クエリー:PostgreSQL OR MySQL
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約2ms | 316件 | 約2 |
Groonga | 約1ms | 316件 | 1 |
pg_bigm | 約49ms | 311件 | 約49 |
クエリー:日本
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約563ms | 約53万件 | 約10 |
Groonga | 約59ms | 約53万件 | 1 |
pg_bigm | 約479ms | 約53万件 | 約8 |
再:英語版のまとめ。
環境:
CPU | メモリー | スワップ | ストレージ | OS |
---|---|---|---|---|
Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (24コア) | 32GiB | 2GiB | SSD(500GB) | CentOS 7.2 |
バージョン:
PostgreSQL | PGroonga |
---|---|
9.6.1 | 1.1.8+α |
データ:
サイズ | レコード数 | タイトルの平均バイト数 | タイトルの最長バイト数 | 本文の平均バイト数 | 本文の最長バイト数 |
---|---|---|---|---|---|
約33GiB | 約530万件 | 約19.6B | 211バイト | 約6.4KiB | 約1MiB(1047190B) |
データロード:
時間 | サイズ |
---|---|
約26分 | 約21GB |
インデックス作成:
種類 | 時間 | サイズ | 備考 |
---|---|---|---|
PGroonga | 約1時間24分 | 約39GB | データもロードしている。データはzlibで圧縮している。インデックスのみだと約21GB。 |
pg_trgm | 約1時間50分 | 約7.6GB | maintenance_work_mem は2GB 。 |
textsearch | 約2時間53分 | 約12GB | maintenance_work_mem は2GB 。インデックスできない単語が3923個ある。(*) |
(*) エラーメッセージ:
NOTICE: word is too long to be indexed
DETAIL: Words longer than 2047 characters are ignored.
本文の最大バイト数が1047190Bで1MiB - 1(1048576B)にギリギリ収まっている。これを超えると以下のエラーメッセージがでてインデックスを作成できない。
string is too long for tsvector (1618908 bytes, max 1048575 bytes)
検索:
pgroonga.command('select ...')
で実行したもの。クエリー:animation
種類 | 時間 | 件数 | 相対時間 | 備考 |
---|---|---|---|---|
PGroonga | 約173ms | 約4万件 | 約29 | |
Groonga | 約6ms | 約4万件 | 1 | |
pg_trgm | 約44s | 約3万件 | 約7333 | |
textsearch | 約1s | 約42万件 | 約167 | 件数が1桁多いのはステミングして「anim」で検索しているから |
クエリー:database
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約698ms | 約21万件 | 約37 |
Groonga | 約19ms | 約21万件 | 1 |
pg_trgm | 約33s | 約13万件 | 約1736 |
textsearch | 約602ms | 約19万件 | 約32 |
クエリー:PostgreSQL OR MySQL
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約6ms | 1636件 | 約2 |
Groonga | 約3ms | 1636件 | 1 |
pg_trgm | 約241ms | 1484件 | 約80 |
textsearch | 約3ms | 1506件 | 1 |
クエリー:America
種類 | 時間 | 件数 | 相対時間 |
---|---|---|---|
PGroonga | 約1.3s | 約47万件 | 約29 |
Groonga | 約45ms | 約47万件 | 1 |
pg_trgm | 約1m32s | 約141万件 | 約2044 |
textsearch | 約1.2s | 約48万件 | 約26 |
英語版Wikipediaを使う。