groonga 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NEWS.ja.rdoc +11 -0
- data/NEWS.rdoc +11 -0
- data/README.ja.rdoc +4 -3
- data/README.rdoc +4 -3
- data/Rakefile +1 -1
- data/TUTORIAL.ja.rdoc +168 -44
- data/benchmark/common.rb +49 -0
- data/benchmark/read-write-small-many-items.rb +156 -0
- data/benchmark/write-small-many-items.rb +145 -0
- data/example/bookmark.rb +68 -20
- data/ext/rb-grn-array-cursor.c +8 -0
- data/ext/rb-grn-array.c +40 -11
- data/ext/rb-grn-column.c +38 -209
- data/ext/rb-grn-context.c +203 -56
- data/ext/rb-grn-database.c +119 -5
- data/ext/rb-grn-encoding-support.c +64 -0
- data/ext/rb-grn-encoding.c +58 -1
- data/ext/rb-grn-fix-size-column.c +220 -0
- data/ext/rb-grn-hash-cursor.c +8 -0
- data/ext/rb-grn-hash.c +244 -2
- data/ext/rb-grn-index-column.c +474 -0
- data/ext/rb-grn-object.c +143 -265
- data/ext/rb-grn-patricia-trie.c +148 -2
- data/ext/rb-grn-query.c +5 -3
- data/ext/rb-grn-record.c +3 -2
- data/ext/rb-grn-snippet.c +5 -3
- data/ext/rb-grn-table-cursor-key-support.c +3 -3
- data/ext/rb-grn-table-cursor.c +106 -112
- data/ext/rb-grn-table-key-support.c +220 -118
- data/ext/rb-grn-table.c +336 -80
- data/ext/rb-grn-type.c +5 -4
- data/ext/rb-grn-utils.c +62 -63
- data/ext/rb-grn.h +215 -14
- data/ext/rb-groonga.c +7 -16
- data/extconf.rb +3 -1
- data/html/favicon.ico +0 -0
- data/html/favicon.xcf +0 -0
- data/html/index.html +1 -7
- data/lib/groonga/record.rb +6 -1
- data/test/groonga-test-utils.rb +1 -0
- data/test/test-array.rb +81 -0
- data/test/test-column.rb +22 -12
- data/test/test-context.rb +1 -29
- data/test/test-database.rb +30 -0
- data/test/test-hash.rb +194 -0
- data/test/test-index-column.rb +57 -0
- data/test/test-patricia-trie.rb +82 -0
- data/test/test-record.rb +10 -10
- data/test/test-table.rb +37 -130
- data/test/test-type.rb +4 -3
- metadata +15 -4
- data/benchmark/small-many-items.rb +0 -175
data/NEWS.ja.rdoc
CHANGED
data/NEWS.rdoc
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
= NEWS
|
2
2
|
|
3
|
+
== 0.0.2: 2009-06-04
|
4
|
+
|
5
|
+
* Supported groonga 0.0.9 [mori]
|
6
|
+
* Improved preformance: cache key, value, domain and range
|
7
|
+
* Improved API
|
8
|
+
* Added documents
|
9
|
+
* Supported Ruby 1.9
|
10
|
+
* Bug fixes:
|
11
|
+
** Fixed install process [Tasuku SUENAGA]
|
12
|
+
** Fixed memory leaks
|
13
|
+
|
3
14
|
== 0.0.1: 2009-04-30
|
4
15
|
|
5
16
|
* Initial release!
|
data/README.ja.rdoc
CHANGED
@@ -20,7 +20,7 @@ groongaに関する情報は以下を参照して下さい。
|
|
20
20
|
|
21
21
|
== 作者
|
22
22
|
|
23
|
-
Kouhei Sutou <kou@clear-code.com>
|
23
|
+
Kouhei Sutou: <tt><kou@clear-code.com></tt>
|
24
24
|
|
25
25
|
== ライセンス
|
26
26
|
|
@@ -32,7 +32,7 @@ pkg-config.rbはrcairoに付属しているもので、これはRubyライセ
|
|
32
32
|
== 依存ソフトウェア
|
33
33
|
|
34
34
|
* Ruby >= 1.8 (1.9.1対応)
|
35
|
-
* groonga >= 0.0.
|
35
|
+
* groonga >= 0.0.8
|
36
36
|
|
37
37
|
== インストール
|
38
38
|
|
@@ -50,4 +50,5 @@ http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
|
|
50
50
|
|
51
51
|
== 感謝
|
52
52
|
|
53
|
-
*
|
53
|
+
* 森さん: 最新groonga対応パッチをくれました。
|
54
|
+
* グニャラくん: バグレポートしてくれました。
|
data/README.rdoc
CHANGED
@@ -20,7 +20,7 @@ See the following URL about groonga.
|
|
20
20
|
|
21
21
|
== Author
|
22
22
|
|
23
|
-
Kouhei Sutou <kou@clear-code.com>
|
23
|
+
Kouhei Sutou: <tt><kou@clear-code.com></tt>
|
24
24
|
|
25
25
|
== License
|
26
26
|
|
@@ -33,7 +33,7 @@ license/GPL for details.
|
|
33
33
|
== Dependencies
|
34
34
|
|
35
35
|
* Ruby >= 1.8 (including 1.9.1)
|
36
|
-
* groonga >= 0.0.
|
36
|
+
* groonga >= 0.0.8
|
37
37
|
|
38
38
|
== Install
|
39
39
|
|
@@ -51,4 +51,5 @@ http://rubyforge.org/mailman/listinfo/groonga-users-en
|
|
51
51
|
|
52
52
|
== Thanks
|
53
53
|
|
54
|
-
*
|
54
|
+
* mori: sent patches to support the latest groonga.
|
55
|
+
* Tasuku SUENAGA: sent bug reports.
|
data/Rakefile
CHANGED
@@ -27,7 +27,7 @@ require 'hoe'
|
|
27
27
|
|
28
28
|
ENV["NODOT"] = "yes"
|
29
29
|
|
30
|
-
Hoe::SUPPORTED_TEST_FRAMEWORKS[:testunit2] = "test/run-test.rb"
|
30
|
+
Hoe::Test::SUPPORTED_TEST_FRAMEWORKS[:testunit2] = "test/run-test.rb"
|
31
31
|
|
32
32
|
base_dir = File.join(File.dirname(__FILE__))
|
33
33
|
truncate_base_dir = Proc.new do |x|
|
data/TUTORIAL.ja.rdoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= チュートリアル
|
2
2
|
|
3
3
|
このページでは簡単なアプリケーションの作成を通して
|
4
|
-
Ruby/groonga
|
4
|
+
Ruby/groongaの操作方法を紹介します。
|
5
5
|
|
6
6
|
== インストール
|
7
7
|
|
@@ -50,14 +50,14 @@ groongaには以下の3種類のテーブルがあります。
|
|
50
50
|
配列。主キーの存在しないテーブルです。レコードはIDによって
|
51
51
|
識別します。
|
52
52
|
|
53
|
-
|
53
|
+
ここではハッシュテーブルを利用して、<tt><items></tt>という名前のテー
|
54
54
|
ブルを作成します。
|
55
55
|
|
56
56
|
>> items = Groonga::Hash.create(:name => "<items>", :persistent => true)
|
57
57
|
=> #<Groonga::Hash id: <18>, name: <<items>>, path: </tmp/bookmark.db.0000012>, domain: <nil>, range: <nil>, encoding: <:utf8>, size: <0>>
|
58
58
|
|
59
59
|
|
60
|
-
|
60
|
+
これで<tt><items></tt>という名前のテーブルが作成できました。
|
61
61
|
|
62
62
|
テーブルはRubyのHashのように扱えます。
|
63
63
|
|
@@ -72,9 +72,9 @@ groongaには以下の3種類のテーブルがあります。
|
|
72
72
|
items>テーブルにレコードを追加します。
|
73
73
|
|
74
74
|
>> items.add("http://ja.wikipedia.org/wiki/Ruby")
|
75
|
-
=> #<Groonga::Record
|
75
|
+
=> #<Groonga::Record ...>
|
76
76
|
>> items.add("http://www.ruby-lang.org/")
|
77
|
-
=> #<Groonga::Record
|
77
|
+
=> #<Groonga::Record ...>
|
78
78
|
|
79
79
|
件数を確認すると確かに2件増えています。
|
80
80
|
|
@@ -83,21 +83,21 @@ items>テーブルにレコードを追加します。
|
|
83
83
|
|
84
84
|
主キーを指定してレコードを取り出す時には以下のようにします。
|
85
85
|
|
86
|
-
>> items
|
87
|
-
=> #<Groonga::Record
|
86
|
+
>> items.find("http://ja.wikipedia.org/wiki/Ruby")
|
87
|
+
=> #<Groonga::Record ...>
|
88
88
|
|
89
89
|
== 全文検索を行う
|
90
90
|
|
91
91
|
各itemのタイトル文字列を登録して、全文検索できるようにしてみ
|
92
92
|
ましょう。
|
93
93
|
|
94
|
-
|
94
|
+
まず<tt><items></tt>テーブルに+title+という名前のカラムを追加します。
|
95
95
|
|
96
|
-
>> title_colum = items.define_column("title", "<text>")
|
97
|
-
=> #<Groonga::VarSizeColumn
|
96
|
+
>> title_colum = items.define_column("title", "<text>", :persistent => true)
|
97
|
+
=> #<Groonga::VarSizeColumn ...>
|
98
98
|
|
99
99
|
2番目の引数は、追加するカラムのデータ型を示しています。
|
100
|
-
|
100
|
+
<tt><int></tt>、<tt><text></tt>、<tt><longtext></tt>等の型が基本型として用意されて
|
101
101
|
います。
|
102
102
|
|
103
103
|
全文検索するためには、文字列を分解して得られる各単語を格納す
|
@@ -106,42 +106,51 @@ items>テーブルにレコードを追加します。
|
|
106
106
|
|
107
107
|
>> terms = Groonga::Hash.create(:name => "<terms>",
|
108
108
|
:key_type => "<shorttext>",
|
109
|
-
:persistent => true
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
109
|
+
:persistent => true,
|
110
|
+
:default_tokenizer => "<token:bigram>")
|
111
|
+
=> #<Groonga::Hash ...>
|
112
|
+
|
113
|
+
ここでは、トークナイザとして<tt>:default_tokenzier =>
|
114
|
+
"<token:bigram>"</tt> を指定しています。トークナイザとは文字
|
115
|
+
列を単語に分解するオブジェクトのことです。デフォルトではトー
|
116
|
+
クナイザは指定されていません。全文検索を利用するためにはトー
|
117
|
+
クナイザを指定する必要があるので、ここではN-gramの一種である
|
118
|
+
バイグラムを指定しています。
|
119
|
+
|
120
|
+
N-gramを利用した全文検索では、分解したN文字とその出現位置を利
|
121
|
+
用して全文検索を行います。N-gramのNは文字列を何文字毎に分解す
|
122
|
+
るかの文字数になります。groongaは1文字で分解するユニグラム、
|
123
|
+
2文字のバイグラム、3文字のトリグラムをサポートしています。
|
124
|
+
|
125
|
+
単語格納用テーブルの準備ができたので、<tt><items></tt>テーブ
|
126
|
+
ルの+title+カラムに対するインデックスを定義します。
|
127
|
+
|
128
|
+
>> terms.define_index_column("item_title", items,
|
129
|
+
:persistent => true,
|
130
|
+
:source => "<items>.title")
|
131
|
+
=> #<Groonga::IndexColumn ...>
|
132
|
+
|
133
|
+
少し違和感を感じるかも知れませんが、<tt><items></tt>テーブル
|
134
|
+
のカラムに対するインデックスは、<tt><terms></tt>テーブルのカ
|
135
|
+
ラムとして定義します。
|
136
|
+
|
137
|
+
<tt><items></tt>にレコードが登録されると、その中に含まれる単
|
138
|
+
語に該当するレコードが<tt><terms></tt>に自動的に追加されるよ
|
139
|
+
うになります。
|
140
|
+
|
141
|
+
<tt><terms></tt>は、文書に含まれる語彙に相当する、やや特殊な
|
142
|
+
テーブルだと言えます。しかし、他のテーブルと同様に語彙テーブ
|
143
|
+
ルには自由にカラムを追加し、単語毎の様々な属性を管理すること
|
144
|
+
ができます。これはある種の検索処理を行う際には非常に便利に機
|
145
|
+
能します。
|
137
146
|
|
138
147
|
これでテーブルの定義は完了です。
|
139
148
|
|
140
149
|
先ほど登録した各レコードの+title+カラムに値をセットします。
|
141
150
|
|
142
|
-
>> items
|
151
|
+
>> items.find("http://ja.wikipedia.org/wiki/Ruby")["title"] = "Ruby"
|
143
152
|
=> "Ruby"
|
144
|
-
>> items
|
153
|
+
>> items.find("http://www.ruby-lang.org/")["title"] = "オブジェクトスクリプト言語Ruby"
|
145
154
|
"オブジェクトスクリプト言語Ruby"
|
146
155
|
|
147
156
|
以下のようにして検索することができます。
|
@@ -150,11 +159,126 @@ items>テーブルにレコードを追加します。
|
|
150
159
|
["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/"]
|
151
160
|
|
152
161
|
検索結果はGroonga::Hashで返されます。ハッシュのキーに見つかっ
|
153
|
-
|
154
|
-
|
155
|
-
|
162
|
+
た<tt><items></tt>のレコードが入っています。上の例では
|
163
|
+
+record.key+で<tt><items></tt>のレコードを取得して、さらにそ
|
164
|
+
のキーを指定して(+record.key.key+)で<tt><items></tt>のキー
|
165
|
+
を返しています。
|
156
166
|
|
157
167
|
|
158
168
|
== マルチユーザ向けのブックマークアプリケーション
|
159
169
|
|
170
|
+
ここまでで作った単機能のアプリケーションをもう少し拡張して、
|
171
|
+
複数のユーザが、それぞれにコメントを記入できるブックマークア
|
172
|
+
プリケーションにしてみましょう。
|
173
|
+
|
174
|
+
まず、ユーザ情報とコメント情報を格納するテーブルを追加して、
|
175
|
+
下図のようなテーブル構成にします。
|
176
|
+
|
177
|
+
http://qwik.jp/senna/senna2.files/rect4605.png
|
178
|
+
|
179
|
+
まず、<tt><users></tt>テーブルを追加します。
|
180
|
+
|
181
|
+
>> users = Groonga::Hash.create(:name => "<users>",
|
182
|
+
:key_type => "<shorttext>")
|
183
|
+
=> #<Groonga::Hash ...>
|
184
|
+
>> users.define_column("name", "<text>")
|
185
|
+
=> #<Groonga::VarSizeColumn ...>
|
186
|
+
|
187
|
+
|
188
|
+
次に、<tt><comments></tt>テーブルを追加します。
|
189
|
+
|
190
|
+
>> comments = Groonga::Hash.create(:name => "<comments>",
|
191
|
+
:key_type => "<shorttext>")
|
192
|
+
=> #<Groonga::Hash ...>
|
193
|
+
>> comments.define_column("item", items)
|
194
|
+
=> #<Groonga::FixSizeColumn ..>
|
195
|
+
>> comments.define_column("author", users)
|
196
|
+
=> #<Groonga::FixSizeColumn ..>
|
197
|
+
>> comments.define_column("content", "<text>")
|
198
|
+
=> #<Groonga::VarSizeColumn ..>
|
199
|
+
>> comments.define_column("issued", "<time>")
|
200
|
+
=> #<Groonga::FixSizeColumn ..>
|
201
|
+
|
202
|
+
<tt><comments></tt>テーブルの+content+カラムを全文検索できる
|
203
|
+
ようにインデックスを定義します。
|
204
|
+
|
205
|
+
>> terms.define_index_column("comment_content", comments,
|
206
|
+
:source => "<comments>.content")
|
207
|
+
=> #<Groonga::IndexColumn ...>
|
208
|
+
|
209
|
+
これでテーブルが定義できました。
|
210
|
+
|
211
|
+
続いてユーザを何人か追加します。
|
212
|
+
|
213
|
+
>> users.add("moritan", :name => "モリタン")
|
214
|
+
=> #<Groonga::Record ...>
|
215
|
+
>> users.add("taporobo", :name => "タポロボ")
|
216
|
+
=> #<Groonga::Record ...>
|
217
|
+
|
218
|
+
次に、実際にユーザがブックマークを貼る時の処理を実行してみま
|
219
|
+
しょう。
|
220
|
+
|
221
|
+
ユーザ+moritan+が、はてなダイアリーのとあるページをブックマーク
|
222
|
+
したと想定します。
|
223
|
+
|
224
|
+
まず対象のページが<tt><items></tt>テーブルに登録済かどうか調
|
225
|
+
べます。
|
226
|
+
|
227
|
+
>> items.find("http://d.hatena.ne.jp/brazil/20050829/1125321936")
|
228
|
+
=> nil
|
229
|
+
|
230
|
+
未登録なのでまず当該ページを<tt><items></tt>に登録します。
|
231
|
+
|
232
|
+
>> items.add("http://d.hatena.ne.jp/brazil/20050829/1125321936",
|
233
|
+
:title => "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語")
|
234
|
+
=> #<Groonga::Record ...>
|
235
|
+
|
236
|
+
次に、登録したitemを+item+カラムの値に指定して
|
237
|
+
<tt><comments></tt>にレコードを登録します。
|
238
|
+
|
239
|
+
>> comments.add(:item => "http://d.hatena.ne.jp/brazil/20050829/1125321936",
|
240
|
+
:author => "moritan",
|
241
|
+
:content => "JavaScript LISP",
|
242
|
+
:issued => 1187430026)
|
243
|
+
=> #<Groonga::Record ...>
|
244
|
+
|
245
|
+
== メソッド化
|
246
|
+
|
247
|
+
上記の一連の手続きをメソッドにまとめてみます。
|
248
|
+
|
249
|
+
>> @items = items
|
250
|
+
>> @comments = comments
|
251
|
+
>> def add_bookmark(url, title, author, content, issued)
|
252
|
+
>> item = @items.find(url) || @items.add(url, :title => title)
|
253
|
+
>> @comments.add(:item => item,
|
254
|
+
>> :author => author,
|
255
|
+
>> :content => content,
|
256
|
+
>> :issued => issued)
|
257
|
+
>> end
|
258
|
+
|
259
|
+
+itmes+と+comments+をインスタンス変数に代入しているのはメソッ
|
260
|
+
ド内からでも見えるようにするためです。
|
261
|
+
|
262
|
+
+add_bookmark+は以下のような手順を実行しています。
|
263
|
+
|
264
|
+
* <tt><items></tt>テーブルに該当ページのレコードがあるかどうか調べる。
|
265
|
+
* レコードがなければ追加する。
|
266
|
+
* <tt><comments></tt>テーブルにレコードを登録する。
|
267
|
+
|
268
|
+
作成したメソッドを呼び出していくつかブックマークを登録してみ
|
269
|
+
ましょう。
|
270
|
+
|
271
|
+
>> add_bookmark("http://practical-scheme.net/docs/cont-j.html",
|
272
|
+
"なんでも継続", "moritan", "継続 LISP Scheme", 1187568692)
|
273
|
+
=> #<Groonga::Record ...>
|
274
|
+
>> add_bookmark("http://d.hatena.ne.jp/higepon/20070815/1187192864",
|
275
|
+
"末尾再帰", "taporobo", "末尾再帰 Scheme LISP", 1187568793)
|
276
|
+
=> #<Groonga::Record ...>
|
277
|
+
>> add_bookmark("http://practical-scheme.net/docs/cont-j.html",
|
278
|
+
"なんでも継続", "taporobo", "トランポリン LISP continuation",
|
279
|
+
1187568692)
|
280
|
+
=> #<Groonga::Record ...>
|
281
|
+
|
282
|
+
== 全文検索その2
|
283
|
+
|
160
284
|
つづく。。。
|
data/benchmark/common.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
def memory_usage()
|
5
|
+
status = `cat /proc/#{$$}/status`
|
6
|
+
lines = status.split("\n")
|
7
|
+
lines.each do |line|
|
8
|
+
if line =~ /^VmRSS:/
|
9
|
+
line.gsub!(/.*:\s*(\d+).*/, '\1')
|
10
|
+
return line.to_i / 1024.0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
return -1;
|
14
|
+
end
|
15
|
+
|
16
|
+
@items = []
|
17
|
+
|
18
|
+
def item(label, &block)
|
19
|
+
@items << [label, block]
|
20
|
+
end
|
21
|
+
|
22
|
+
def report(index=0)
|
23
|
+
width = @items.collect do |label, _|
|
24
|
+
label.length
|
25
|
+
end.max
|
26
|
+
|
27
|
+
label, block = @items[index]
|
28
|
+
if label.nil?
|
29
|
+
puts "unavailable report ID: #{index}"
|
30
|
+
puts "available IDs:"
|
31
|
+
@items.each_with_index do |(label, block), i|
|
32
|
+
puts "#{i}: #{label}"
|
33
|
+
end
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
|
37
|
+
if index.zero?
|
38
|
+
puts(" " * (width - 1) + Benchmark::Tms::CAPTION.rstrip + "memory".rjust(14))
|
39
|
+
end
|
40
|
+
# GC.disable
|
41
|
+
before = memory_usage
|
42
|
+
result = Benchmark.measure(&block)
|
43
|
+
# GC.enable
|
44
|
+
GC.start
|
45
|
+
size = memory_usage - before
|
46
|
+
|
47
|
+
formatted_size = "%10.3f" % size
|
48
|
+
puts "#{label.ljust(width)} #{result.to_s.strip} #{formatted_size}MB"
|
49
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# This benchmark is based on Tokyo Cabinet's benchmark at
|
4
|
+
# http://alpha.mixi.co.jp/blog/?p=791
|
5
|
+
#
|
6
|
+
# On my environment at 2009/05/16:
|
7
|
+
# % for x in {0..9}; do ruby benchmark/read-write-small-many-items.rb $x; done
|
8
|
+
# user system total real memory
|
9
|
+
# Hash 1.440000 0.120000 1.560000 ( 2.018838) 47.230MB
|
10
|
+
# groonga: Hash: memory 1.780000 0.170000 1.950000 ( 2.331934) 30.582MB
|
11
|
+
# groonga: Trie: memory 2.220000 0.150000 2.370000 ( 2.788049) 22.594MB
|
12
|
+
# groonga: Hash: file 1.810000 0.170000 1.980000 ( 2.389940) 30.590MB
|
13
|
+
# groonga: Trie: file 2.170000 0.150000 2.320000 ( 2.862775) 22.594MB
|
14
|
+
# Localmemcache: file 1.710000 0.240000 1.950000 ( 2.311414) 46.410MB
|
15
|
+
# TC: Hash: memory 1.540000 0.180000 1.720000 ( 2.048307) 49.180MB
|
16
|
+
# TC: Tree: memory 1.410000 0.160000 1.570000 ( 1.891273) 37.691MB
|
17
|
+
# TC: Hash: file 2.420000 2.950000 5.370000 ( 7.122531) 9.258MB
|
18
|
+
# TC: Tree: file 2.080000 0.220000 2.300000 ( 2.876335) 13.234MB
|
19
|
+
#
|
20
|
+
# Ruby: Debian GNU/Linux sid at 2009/05/16:
|
21
|
+
# ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
|
22
|
+
# groonga: HEAD at 2009/05/16: ed49074fbc217b97c0b0b8d675f2417f9490c87e
|
23
|
+
# Ruby/Groonga: trunk at 2009/05/16: r321
|
24
|
+
# Localmemcache: HEAD at 2009/05/16: 6f8cfbd3a103c2be8d54834a65deb096d7cda34f
|
25
|
+
# Tokyo Cabinet: 1.4.20
|
26
|
+
# Tokyo Cabinet Ruby: 1.23
|
27
|
+
#
|
28
|
+
# NOTE: All C source codes are built with "-g -O0"
|
29
|
+
# option. They will be more faster with "-O2" option.
|
30
|
+
|
31
|
+
require File.join(File.dirname(__FILE__), "common.rb")
|
32
|
+
|
33
|
+
n = 500000
|
34
|
+
|
35
|
+
values = []
|
36
|
+
n.times do |i|
|
37
|
+
values << "%08d" % i
|
38
|
+
end
|
39
|
+
|
40
|
+
item("Hash") do
|
41
|
+
@hash = {}
|
42
|
+
values.each do |value|
|
43
|
+
@hash[value] = value
|
44
|
+
@hash[value]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
begin
|
49
|
+
base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
50
|
+
$LOAD_PATH.unshift(File.join(base_dir, "ext"))
|
51
|
+
$LOAD_PATH.unshift(File.join(base_dir, "lib"))
|
52
|
+
|
53
|
+
require 'groonga'
|
54
|
+
@database = Groonga::Database.create
|
55
|
+
|
56
|
+
item("groonga: Hash: memory") do
|
57
|
+
@hash = Groonga::Hash.create(:key_type => "<shorttext>",
|
58
|
+
:value_size => 8)
|
59
|
+
values.each do |value|
|
60
|
+
@hash[value] = value
|
61
|
+
@hash[value]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
item("groonga: Trie: memory") do
|
66
|
+
@hash = Groonga::PatriciaTrie.create(:key_type => "<shorttext>",
|
67
|
+
:value_size => 8)
|
68
|
+
values.each do |value|
|
69
|
+
@hash[value] = value
|
70
|
+
@hash[value]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
@hash_file = Tempfile.new("groonga-hash")
|
75
|
+
item("groonga: Hash: file") do
|
76
|
+
@hash = Groonga::Hash.create(:key_type => "<shorttext>",
|
77
|
+
:value_size => 8,
|
78
|
+
:path => @hash_file.path)
|
79
|
+
values.each do |value|
|
80
|
+
@hash[value] = value
|
81
|
+
@hash[value]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
trie_file = Tempfile.new("groonga-trie")
|
86
|
+
item("groonga: Trie: file") do
|
87
|
+
@hash = Groonga::PatriciaTrie.create(:key_type => "<shorttext>",
|
88
|
+
:value_size => 8,
|
89
|
+
:path => trie_file.path)
|
90
|
+
values.each do |value|
|
91
|
+
@hash[value] = value
|
92
|
+
@hash[value]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
rescue LoadError
|
96
|
+
end
|
97
|
+
|
98
|
+
begin
|
99
|
+
require 'localmemcache'
|
100
|
+
|
101
|
+
item("Localmemcache: file") do
|
102
|
+
LocalMemCache.drop(:namespace => "read-write-small-many-items",
|
103
|
+
:force => true)
|
104
|
+
@db = LocalMemCache.new(:namespace => "read-write-small-many-items")
|
105
|
+
values.each do |value|
|
106
|
+
@db[value] = value
|
107
|
+
@db[value]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
rescue LoadError
|
111
|
+
end
|
112
|
+
|
113
|
+
begin
|
114
|
+
require 'tokyocabinet'
|
115
|
+
|
116
|
+
item("TC: Hash: memory") do
|
117
|
+
@db = TokyoCabinet::ADB::new
|
118
|
+
@db.open("*#bnum=#{n}#mode=wct#xmsiz=0")
|
119
|
+
values.each do |value|
|
120
|
+
@db.put(value, value)
|
121
|
+
@db.get(value)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
item("TC: Tree: memory") do
|
126
|
+
@db = TokyoCabinet::ADB::new
|
127
|
+
@db.open("+#bnum=#{n}#mode=wct#xmsiz=0")
|
128
|
+
values.each do |value|
|
129
|
+
@db.put(value, value)
|
130
|
+
@db.get(value)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
hash_file = Tempfile.new(["tc-hash", ".tch"])
|
135
|
+
item("TC: Hash: file") do
|
136
|
+
@db = TokyoCabinet::ADB::new
|
137
|
+
@db.open("#{hash_file.path}#bnum=#{n}#mode=wct#xmsiz=0")
|
138
|
+
values.each do |value|
|
139
|
+
@db.put(value, value)
|
140
|
+
@db.get(value)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
tree_file = Tempfile.new(["tc-tree", ".tcb"])
|
145
|
+
item("TC: Tree: file") do
|
146
|
+
@db = TokyoCabinet::ADB::new
|
147
|
+
@db.open("#{tree_file.path}#bnum=#{n}#mode=wct#xmsiz=0")
|
148
|
+
values.each do |value|
|
149
|
+
@db.put(value, value)
|
150
|
+
@db.get(value)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
rescue LoadError
|
154
|
+
end
|
155
|
+
|
156
|
+
report(Integer(ARGV[0] || 0))
|