Kouhei Sutou
kou****@clear*****
2015年 1月 8日 (木) 18:26:21 JST
須藤です。
森さんに相談です。
(すみません。。。前置きが長いです。。。)
この件(ソースコードで言えばdefine WIN32_FMO_EACHした場合の
こと)なんですが、手元で、20GBくらいのデータを投入して、静的
インデックス構築をして、全文検索をする、というのを確認したと
ころ、従来のバージョンと同じ結果になりました。なので、この方
式でいっても大丈夫なんじゃないかという感触を感じています。
(本当はデータ更新なども動作確認しないといけないんです
が。。。)
なので、後方互換性を保ったままこの機能を有効にしていく方向が
いいんじゃないかと思っています。具体的には次のような流れです。
1. すでに従来のファイル確保方式で作られたテーブル・カラム
を開いた場合は従来のファイル確保方式を使い続ける
2. 新しく作るテーブル・カラムは、ユーザーが指定すれば(*)、
新しいファイル確保方式(WIN32_FMO_EACHバージョン)を使
うようにする。
デフォルトでは従来のファイル確保方式を使う。
(*) 例えば環境変数など。
3. 新しく作るテーブル・カラムは、デフォルトで
新しいファイル確保方式(WIN32_FMO_EACHバージョン)を使
うようにする。
ユーザーが指定したら従来のファイル確保方式を使う。
4. しばらくしたら(数年経つとか)
従来のファイル確保方式のサポートをやめる
1.から3.の間はすでに作られたファイルからどの方式を使うか決め
ないといけません。
で、その実装方法について相談です。
方式によって変わるのは、必要なfileinfoの数とgrn_mmap()の実装
です。方式がわかってからこれらを使うようにすれば動的に方式を
切り替えられます。なので、できるだけ早い段階でわかるようにな
りたいです。
ということで、どの方式を使っているかという情報が
ファイルから一番最初に読み出す情報であるgrn_io_headerに入っ
ていると嬉しいです。
grn_io_headerに入れる場合、入れる候補としてversionとflagsが
考えられます。今、versionは使われていないっぽいのですが、私
はversionを使うといいんじゃないかと思っています。
今はversion=0となっているはずなので、version=0なら従来の方式、
version=1なら新しい方式、といった具合です。
grn_io_headerのversionはそういうもののために用意したんじゃな
いんだよ!というのであれば不適切な気がするので、森さんに相談
したいです。
In <20141****@clear*****>
"[groonga-dev,03036] Windowsでの動作確認のお願い" on Sat, 27 Dec 2014 15:33:59 +0900 (JST),
Kouhei Sutou <kou****@clear*****> wrote:
> 須藤です。
>
> WindowsでGroongaを使っている人に動作確認のお願いがあります。
>
> Windows版のGroongaではカラムを作るといきなり大きめのサイズ
> (128MiB)のファイルを作ります。そのため、10個カラムを作ると
> 1.25GiBのストレージを消費します。それぞれのカラムに128MiBく
> らいのデータを入れる場合は無駄な領域はそれほどないのですが、
> 数KiBくらいしかデータをいれないときは結構無駄な領域になりま
> す。
>
> なお、Windows以外の環境、例えばGNU/Linuxの環境、ではいきなり
> 大きめのサイズのファイルを作らず、必要に応じて徐々に追加して
> いきます。
>
> Windowsでもそのような挙動の方がストレージの使用効率がよくな
> ります。で、実は、ソースの中にはそれを実現するためのコードが
> あるのですが、無効になっています。手元で試した感じ(*)ではそ
> れっぽく動いてそうなのですが、不安なので、他にもWindowsで
> Groongaを使っている人に動作確認をして欲しいのです。
>
> WindowsでGroongaまたはRroongaを使っている人は協力してもらえ
> ないでしょうか?
>
> 協力してくれる方は後述する手順を試してその結果を教えて欲しい
> です。
>
> (*) Cygwinで次のようにして確認した。
>
> $ mkdir -p db
> $ cat load.rb
> puts "table_create logs TABLE_NO_KEY"
> puts "column_create logs message COLUMN_SCALAR Text"
> puts "load --table logs"
> puts "["
> 100000.times do |i|
> puts "{\"message\": \"#{i.to_s * 1000}\"}"
> end
> puts "]"
> $ ruby load.rb | groonga-4.0.8-x64-reduce-db-size/bin/groonga.exe -n db/db
> $ ls -lah db
> total 1.3G
> drwxr-xr-x+ 1 kou None 0 Dec 27 06:06 .
> drwxr-xr-x+ 1 kou None 0 Dec 27 06:05 ..
> -rwxr-xr-x 1 kou None 64K Dec 27 06:05 db
> -rwxr-xr-x 1 kou None 21M Dec 27 06:05 db.0000000
> -rwxr-xr-x 1 kou None 17M Dec 27 06:06 db.0000100
> -rwxr-xr-x 1 kou None 1021M Dec 27 06:06 db.0000101
> -rwxr-xr-x 1 kou None 232M Dec 27 06:07 db.0000101.001
> -rwxr-xr-x 1 kou None 1.0M Dec 27 06:05 db.001
>
> たとえば、↑のdb.0000101(logsテーブルのファイル)のサイ
> ズが17Mとなっていて128MiBより小さい。
>
> 他にも、db.0000101(messagesカラムのファイル)のサイズが
> 1GiBまで増えている。既存のGroongaでは128MiBのファイルば
> かりになる。
>
> 試し方
> ------
>
> 1. http://packages.groonga.org/tmp/groonga-4.0.8-x64-reduce-db-size.zip
> をダウンロードして展開する。
>
> 2. Rroongaの人はRroongaのgemのディレクトリーの中のvendor\local\
> 以下を↑で置き換える。
>
> 3. 新しくデータベースを作成する。
> 注意:このGroongaは既存のデータベースと互換性がないので、
> 既存のデータベースは使わないでください。壊れるかもしれ
> ません。
>
> 4. いつもと同じ使い方をする。
> →既存のGroongaと同じ挙動だったか教えてください。
> →もしわかるなら次のことも教えて欲しいです。
> * 複数のプロセスから同じデータベースを開いたか
> * 複数のスレッドで同じデータベースにアクセスしたか
> * データの書き込みをしたか参照だけだったか
>
> 期待する挙動:既存のGroongaと同じ挙動。
>
> 5. データベースのサイズを確認する。
> →データベースのサイズを教えてください。前述の私が試し
> たときの確認方法のようにファイル名とファイルサイズが入っ
> たリストになっていればOKです。(Cygwinをインストールし
> てlsを使う必要はありません。)
>
> 今後の予定
> ----------
>
> もし、試してもらった結果で問題がないことが確認できたら、既存
> のテーブル・カラムを使うときはこれまでと同じ挙動(最初に
> 128MiBを確保する)、新しいテーブル・カラムを作ったらそれらは
> 新しい挙動(必要に応じて徐々に大きくする)で動くようにしよう
> と思っています。
>
> つまり、後方互換性を維持しよう(新しいGroongaでも古いGroonga
> で作ったデータベースを開ける)と思います。
>
> 一方、前方互換性は維持しない(新しいGroongaで作ったデータベー
> スは古いGroongaで使えない)予定です。
>
>
> WindowsでのGroongaユーザーのみなさん、協力おねがいします!
>
> --
> 須藤 功平 <kou****@clear*****>
> 株式会社クリアコード <http://www.clear-code.com/>
>
> Groongaベースの全文検索システムを総合サポート:
> http://groonga.org/ja/support/
> パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
> http://www.clear-code.com/recruitment/
> コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
> http://www.clear-code.com/services/code-reader/
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev