groonga 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.ja.rdoc +18 -3
- data/NEWS.rdoc +18 -3
- data/README.ja.rdoc +2 -0
- data/README.rdoc +2 -0
- data/Rakefile +14 -5
- data/TUTORIAL.ja.rdoc +82 -16
- data/benchmark/{read-write-small-many-items.rb → read-write-many-small-items.rb} +26 -23
- data/benchmark/{write-small-many-items.rb → write-many-small-items.rb} +26 -23
- data/example/bookmark.rb +49 -5
- data/ext/rb-grn-array.c +11 -1
- data/ext/rb-grn-column.c +132 -5
- data/ext/rb-grn-context.c +85 -80
- data/ext/rb-grn-database.c +182 -9
- data/ext/rb-grn-expression-builder.c +69 -0
- data/ext/rb-grn-expression.c +314 -0
- data/ext/rb-grn-fix-size-column.c +68 -89
- data/ext/rb-grn-hash.c +14 -5
- data/ext/rb-grn-index-column.c +14 -55
- data/ext/rb-grn-object.c +206 -75
- data/ext/rb-grn-operation.c +92 -0
- data/ext/rb-grn-patricia-trie.c +10 -32
- data/ext/rb-grn-query.c +9 -9
- data/ext/rb-grn-table-cursor.c +19 -80
- data/ext/rb-grn-table-key-support.c +33 -39
- data/ext/rb-grn-table.c +436 -79
- data/ext/rb-grn-type.c +10 -3
- data/ext/rb-grn-utils.c +131 -4
- data/ext/rb-grn-variable-size-column.c +36 -0
- data/ext/rb-grn-variable.c +90 -0
- data/ext/rb-grn.h +109 -56
- data/ext/rb-groonga.c +4 -0
- data/extconf.rb +39 -13
- data/html/index.html +2 -2
- data/lib/groonga.rb +22 -0
- data/lib/groonga/expression-builder.rb +141 -0
- data/lib/groonga/record.rb +25 -1
- data/lib/groonga/schema.rb +418 -0
- data/test/test-column.rb +11 -23
- data/test/test-context.rb +1 -1
- data/test/test-database.rb +60 -19
- data/test/test-expression-builder.rb +114 -0
- data/test/test-expression.rb +55 -0
- data/test/test-fix-size-column.rb +53 -0
- data/test/test-hash.rb +10 -3
- data/test/test-index-column.rb +24 -0
- data/test/test-patricia-trie.rb +9 -0
- data/test/test-procedure.rb +5 -5
- data/test/test-record.rb +71 -4
- data/test/test-schema.rb +207 -0
- data/test/test-table.rb +94 -12
- data/test/test-type.rb +18 -11
- data/test/test-variable-size-column.rb +53 -0
- data/test/test-variable.rb +28 -0
- metadata +18 -5
data/NEWS.ja.rdoc
CHANGED
@@ -1,15 +1,30 @@
|
|
1
1
|
= お知らせ
|
2
2
|
|
3
|
+
== 0.0.3: 2009-07-18
|
4
|
+
|
5
|
+
* [#26145] Groonga::TableKeySupport#has_key?の追加 [Tasuku SUENAGA]
|
6
|
+
* [#26146] カラム名が存在しない場合はGroonga::Record#[]が例外
|
7
|
+
をあげるように変更 [Tasuku SUENAGA]
|
8
|
+
* 32ビット環境をサポート [niku]
|
9
|
+
* N-gramインデックスサーチのテストを追加 [dara]
|
10
|
+
* APIの追加
|
11
|
+
* Groonga::Record#incemrent!
|
12
|
+
* Groonga::Record#decemrent!
|
13
|
+
* Groonga::Record#lock
|
14
|
+
* Groonga::Table#lock
|
15
|
+
* Groonga::Schema: スキーマ定義用DSL
|
16
|
+
* Groonga::Expression
|
17
|
+
|
3
18
|
== 0.0.2: 2009-06-04
|
4
19
|
|
5
|
-
* groonga 0.0.
|
20
|
+
* groonga 0.0.8対応 [mori]
|
6
21
|
* 性能向上: キー、値、ドメイン、レンジをキャッシュ
|
7
22
|
* API改良
|
8
23
|
* ドキュメントの追加
|
9
24
|
* Ruby 1.9対応
|
10
25
|
* バグ修正:
|
11
|
-
|
12
|
-
|
26
|
+
* インストール処理の修正 [Tasuku SUENAGA]
|
27
|
+
* メモリリーク修正
|
13
28
|
|
14
29
|
== 0.0.1: 2009-04-30
|
15
30
|
|
data/NEWS.rdoc
CHANGED
@@ -1,15 +1,30 @@
|
|
1
1
|
= NEWS
|
2
2
|
|
3
|
+
== 0.0.3: 2009-07-18
|
4
|
+
|
5
|
+
* [#26145] Added Groonga::TableKeySupport#has_key? [Tasuku SUENAGA]
|
6
|
+
* [#26146] Groonga::Record#[] raises an exception for nonexistent
|
7
|
+
column name. [Tasuku SUENAGA]
|
8
|
+
* Supported 32bit environment [niku]
|
9
|
+
* Added a test for N-gram index search [dara]
|
10
|
+
* Added APIs
|
11
|
+
* Groonga::Record#incemrent!
|
12
|
+
* Groonga::Record#decemrent!
|
13
|
+
* Groonga::Record#lock
|
14
|
+
* Groonga::Table#lock
|
15
|
+
* Groonga::Schema: A DSL for schema definition
|
16
|
+
* Groonga::Expression
|
17
|
+
|
3
18
|
== 0.0.2: 2009-06-04
|
4
19
|
|
5
|
-
* Supported groonga 0.0.
|
20
|
+
* Supported groonga 0.0.8 [mori]
|
6
21
|
* Improved preformance: cache key, value, domain and range
|
7
22
|
* Improved API
|
8
23
|
* Added documents
|
9
24
|
* Supported Ruby 1.9
|
10
25
|
* Bug fixes:
|
11
|
-
|
12
|
-
|
26
|
+
* Fixed install process [Tasuku SUENAGA]
|
27
|
+
* Fixed memory leaks
|
13
28
|
|
14
29
|
== 0.0.1: 2009-04-30
|
15
30
|
|
data/README.ja.rdoc
CHANGED
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -27,8 +27,6 @@ require 'hoe'
|
|
27
27
|
|
28
28
|
ENV["NODOT"] = "yes"
|
29
29
|
|
30
|
-
Hoe::Test::SUPPORTED_TEST_FRAMEWORKS[:testunit2] = "test/run-test.rb"
|
31
|
-
|
32
30
|
base_dir = File.join(File.dirname(__FILE__))
|
33
31
|
truncate_base_dir = Proc.new do |x|
|
34
32
|
x.gsub(/^#{Regexp.escape(base_dir + File::SEPARATOR)}/, '')
|
@@ -88,7 +86,11 @@ end
|
|
88
86
|
|
89
87
|
ENV["VERSION"] ||= guess_version
|
90
88
|
version = ENV["VERSION"]
|
91
|
-
project =
|
89
|
+
project = nil
|
90
|
+
Hoe.spec('groonga') do |_project|
|
91
|
+
Hoe::Test::SUPPORTED_TEST_FRAMEWORKS[:testunit2] = "test/run-test.rb"
|
92
|
+
project = _project
|
93
|
+
project.version = version
|
92
94
|
project.rubyforge_name = 'groonga'
|
93
95
|
authors = File.join(base_dir, "AUTHORS")
|
94
96
|
project.author = File.readlines(authors).collect do |line|
|
@@ -137,12 +139,13 @@ if /mswin32/ =~ project.spec.platform.to_s
|
|
137
139
|
end
|
138
140
|
|
139
141
|
ObjectSpace.each_object(Rake::RDocTask) do |rdoc_task|
|
140
|
-
|
142
|
+
options = rdoc_task.options
|
143
|
+
t_option_index = options.index("--title") || options.index("-t")
|
141
144
|
rdoc_task.options[t_option_index, 2] = nil
|
142
145
|
rdoc_task.title = "Ruby/groonga - #{version}"
|
143
146
|
|
144
147
|
rdoc_task.rdoc_files = ["ext/rb-groonga.c"] + Dir.glob("ext/rb-grn-*.c")
|
145
|
-
rdoc_task.rdoc_files += Dir.glob("lib
|
148
|
+
rdoc_task.rdoc_files += Dir.glob("lib/**/*.rb")
|
146
149
|
rdoc_task.rdoc_files += Dir.glob("*.rdoc")
|
147
150
|
end
|
148
151
|
|
@@ -202,6 +205,12 @@ task :publish_html do
|
|
202
205
|
sh "rsync #{rsync_args} html/ #{host}:#{remote_dir}"
|
203
206
|
end
|
204
207
|
|
208
|
+
task :tag do
|
209
|
+
repository = "svn+ssh://rubyforge.org/var/svn/groonga/groonga"
|
210
|
+
sh("svn cp -m 'release #{version}!!!' " +
|
211
|
+
"#{repository}/trunk #{repository}/tags/#{version}")
|
212
|
+
end
|
213
|
+
|
205
214
|
# fix Hoe's incorrect guess.
|
206
215
|
project.spec.executables.clear
|
207
216
|
# project.lib_files = project.spec.files.grep(%r|^src/lib/|)
|
data/TUTORIAL.ja.rdoc
CHANGED
@@ -28,7 +28,7 @@ Ruby/groongaはRubyGemsでインストールできます。
|
|
28
28
|
それでは、ファイルを指定してデータベースを作成します。
|
29
29
|
|
30
30
|
>> Groonga::Database.create(:path => "/tmp/bookmark.db")
|
31
|
-
=> #<Groonga::Database
|
31
|
+
=> #<Groonga::Database ...>
|
32
32
|
|
33
33
|
ここで作成したデータベースは、これ以降、暗黙のうちに利用され
|
34
34
|
ます。最初にデータベースを作成したら特に意識する必要はありま
|
@@ -54,7 +54,7 @@ groongaには以下の3種類のテーブルがあります。
|
|
54
54
|
ブルを作成します。
|
55
55
|
|
56
56
|
>> items = Groonga::Hash.create(:name => "<items>", :persistent => true)
|
57
|
-
=> #<Groonga::Hash
|
57
|
+
=> #<Groonga::Hash ...>
|
58
58
|
|
59
59
|
|
60
60
|
これで<tt><items></tt>という名前のテーブルが作成できました。
|
@@ -69,7 +69,7 @@ groongaには以下の3種類のテーブルがあります。
|
|
69
69
|
|
70
70
|
== レコードを追加する
|
71
71
|
|
72
|
-
items>テーブルにレコードを追加します。
|
72
|
+
<tt><items></tt>テーブルにレコードを追加します。
|
73
73
|
|
74
74
|
>> items.add("http://ja.wikipedia.org/wiki/Ruby")
|
75
75
|
=> #<Groonga::Record ...>
|
@@ -93,7 +93,7 @@ items>テーブルにレコードを追加します。
|
|
93
93
|
|
94
94
|
まず<tt><items></tt>テーブルに+title+という名前のカラムを追加します。
|
95
95
|
|
96
|
-
>>
|
96
|
+
>> title_column = items.define_column("title", "<text>", :persistent => true)
|
97
97
|
=> #<Groonga::VarSizeColumn ...>
|
98
98
|
|
99
99
|
2番目の引数は、追加するカラムのデータ型を示しています。
|
@@ -125,9 +125,9 @@ N-gramを利用した全文検索では、分解したN文字とその出現位
|
|
125
125
|
単語格納用テーブルの準備ができたので、<tt><items></tt>テーブ
|
126
126
|
ルの+title+カラムに対するインデックスを定義します。
|
127
127
|
|
128
|
-
>> terms.define_index_column("item_title", items,
|
129
|
-
|
130
|
-
|
128
|
+
>> title_index_column = terms.define_index_column("item_title", items,
|
129
|
+
:persistent => true,
|
130
|
+
:source => "<items>.title")
|
131
131
|
=> #<Groonga::IndexColumn ...>
|
132
132
|
|
133
133
|
少し違和感を感じるかも知れませんが、<tt><items></tt>テーブル
|
@@ -155,7 +155,7 @@ N-gramを利用した全文検索では、分解したN文字とその出現位
|
|
155
155
|
|
156
156
|
以下のようにして検索することができます。
|
157
157
|
|
158
|
-
>> title_index_column.
|
158
|
+
>> title_index_column.search("Ruby").collect {|record| record.key.key}
|
159
159
|
["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/"]
|
160
160
|
|
161
161
|
検索結果はGroonga::Hashで返されます。ハッシュのキーに見つかっ
|
@@ -249,11 +249,11 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
249
249
|
>> @items = items
|
250
250
|
>> @comments = comments
|
251
251
|
>> def add_bookmark(url, title, author, content, issued)
|
252
|
-
>>
|
253
|
-
>>
|
254
|
-
>>
|
255
|
-
>>
|
256
|
-
>>
|
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
257
|
>> end
|
258
258
|
|
259
259
|
+itmes+と+comments+をインスタンス変数に代入しているのはメソッ
|
@@ -261,9 +261,9 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
261
261
|
|
262
262
|
+add_bookmark+は以下のような手順を実行しています。
|
263
263
|
|
264
|
-
|
265
|
-
|
266
|
-
|
264
|
+
* <tt><items></tt>テーブルに該当ページのレコードがあるかどうか調べる。
|
265
|
+
* レコードがなければ追加する。
|
266
|
+
* <tt><comments></tt>テーブルにレコードを登録する。
|
267
267
|
|
268
268
|
作成したメソッドを呼び出していくつかブックマークを登録してみ
|
269
269
|
ましょう。
|
@@ -281,4 +281,70 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
281
281
|
|
282
282
|
== 全文検索その2
|
283
283
|
|
284
|
+
登録したレコードに対して全文検索を実行してみます。
|
285
|
+
|
286
|
+
>> records = comments.select do |record|
|
287
|
+
>> record["content"] =~ "LISP"
|
288
|
+
>> end
|
289
|
+
>> records.each do |record|
|
290
|
+
>> record = record.key
|
291
|
+
>> p [record.id,
|
292
|
+
>> record[".issued"],
|
293
|
+
>> record[".item.title"],
|
294
|
+
>> record[".author.name"],
|
295
|
+
>> record[".content"]]
|
296
|
+
>> end
|
297
|
+
[1, Sat Aug 18 18:40:26 +0900 2007, "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語", "モリタン", "JavaScript LISP"]
|
298
|
+
[2, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "モリタン", "継続 LISP Scheme"]
|
299
|
+
[3, Mon Aug 20 09:13:13 +0900 2007, "末尾再帰", "タポロボ", "末尾再帰 Scheme LISP"]
|
300
|
+
[4, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "タポロボ", "トランポリン LISP continuation"]
|
301
|
+
|
302
|
+
カラムへのアクセスは、カラム名を+.+で繋いで複合データ型の要素
|
303
|
+
を再帰的に辿ることができます。(同様の出力を普通のRDBで実現す
|
304
|
+
るためには、<tt><items></tt>テーブル、<tt><comments></tt>テー
|
305
|
+
ブル、<tt><users></tt>テーブルのJOIN操作が必要になります。)
|
306
|
+
|
307
|
+
上の式の中で、肝心の検索処理は、第一引数の式を評価する時点で
|
308
|
+
完了していて、レコードセットオブジェクトとしてメモリに蓄積さ
|
309
|
+
れています。
|
310
|
+
|
311
|
+
>> records
|
312
|
+
#<Groonga::Hash ..., size: <4>>
|
313
|
+
|
314
|
+
レコードセットは、出力する前に様々に加工することができます。
|
315
|
+
|
316
|
+
以下は、日付で降順にソートしてから出力した例です。
|
317
|
+
|
318
|
+
>> records.sort([{:key => ".issued", :order => "descending"}]).each do |record|
|
319
|
+
>> record = record.key
|
320
|
+
>> p [record.id,
|
321
|
+
>> record[".issued"],
|
322
|
+
>> record[".item.title"],
|
323
|
+
>> record[".author.name"],
|
324
|
+
>> record[".content"]]
|
325
|
+
>> end
|
326
|
+
[3, Mon Aug 20 09:13:13 +0900 2007, "末尾再帰", "タポロボ", "末尾再帰 Scheme LISP"]
|
327
|
+
[2, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "モリタン", "継続 LISP Scheme"]
|
328
|
+
[4, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "タポロボ", "トランポリン LISP continuation"]
|
329
|
+
[1, Sat Aug 18 18:40:26 +0900 2007, "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語", "モリタン", "JavaScript LISP"]
|
330
|
+
|
331
|
+
同じitemが何度も出てくると検索結果が見にくいので、item毎にグ
|
332
|
+
ループ化してみます。
|
333
|
+
|
334
|
+
>> records.group([".item"]).each do |record|
|
335
|
+
>> item = record.key
|
336
|
+
>> p [record[".:nsubrecs"],
|
337
|
+
>> item.key,
|
338
|
+
>> item[".title"]]
|
339
|
+
>> end
|
340
|
+
[1, "http://d.hatena.ne.jp/brazil/20050829/1125321936", "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語"]
|
341
|
+
[2, "http://practical-scheme.net/docs/cont-j.html", "なんでも継続"]
|
342
|
+
[1, "http://d.hatena.ne.jp/higepon/20070815/1187192864", "末尾再帰"]
|
343
|
+
|
344
|
+
+.:nsubrecs+というのはグループ化した単位に含まれるレコードの
|
345
|
+
件数を示します。SQLで言えば、GROUP BY句を含むクエリのcount 関
|
346
|
+
数のような働きです。
|
347
|
+
|
348
|
+
== 少し複雑な検索
|
349
|
+
|
284
350
|
つづく。。。
|
@@ -3,30 +3,33 @@
|
|
3
3
|
# This benchmark is based on Tokyo Cabinet's benchmark at
|
4
4
|
# http://alpha.mixi.co.jp/blog/?p=791
|
5
5
|
#
|
6
|
-
# On my environment at 2009/
|
7
|
-
# % for x in {0..9}; do ruby benchmark/read-write-small-
|
6
|
+
# On my environment at 2009/07/14:
|
7
|
+
# % for x in {0..9}; do ruby benchmark/read-write-many-small-items.rb $x; done
|
8
8
|
# user system total real memory
|
9
|
-
# Hash
|
10
|
-
# groonga: Hash: memory 1.
|
11
|
-
# groonga: Trie: memory
|
12
|
-
# groonga: Hash: file 1.
|
13
|
-
# groonga: Trie: file
|
14
|
-
# Localmemcache: file 1.
|
15
|
-
# TC: Hash: memory
|
16
|
-
# TC: Tree: memory
|
17
|
-
# TC: Hash: file
|
18
|
-
# TC: Tree: file
|
9
|
+
# Hash 0.850000 0.170000 1.020000 ( 1.050703) 46.957MB
|
10
|
+
# groonga: Hash: memory 1.080000 0.180000 1.260000 ( 1.251981) 30.152MB
|
11
|
+
# groonga: Trie: memory 1.300000 0.120000 1.420000 ( 1.429549) 22.199MB
|
12
|
+
# groonga: Hash: file 1.070000 0.190000 1.260000 ( 1.276910) 30.156MB
|
13
|
+
# groonga: Trie: file 1.280000 0.150000 1.430000 ( 1.423066) 22.203MB
|
14
|
+
# Localmemcache: file 1.320000 0.150000 1.470000 ( 1.497013) 45.984MB
|
15
|
+
# TC: Hash: memory 0.940000 0.250000 1.190000 ( 1.248141) 48.758MB
|
16
|
+
# TC: Tree: memory 0.890000 0.140000 1.030000 ( 1.067693) 37.270MB
|
17
|
+
# TC: Hash: file 1.740000 2.390000 4.130000 ( 4.141555) 8.848MB
|
18
|
+
# TC: Tree: file 1.290000 0.180000 1.470000 ( 1.476853) 12.805MB
|
19
19
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
20
|
+
# CPU: Intel(R) Core(TM)2 Duo 2.33GHz
|
21
|
+
# Memory: 2GB
|
22
|
+
# Ruby: Debian GNU/Linux sid at 2009/07/14:
|
23
|
+
# ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]
|
24
|
+
# groonga: HEAD at 2009/07/14: fdaf58df5dd0195c10624eabee3e3f522f4af3f9
|
25
|
+
# Ruby/Groonga: trunk at 2009/07/14: r479
|
26
|
+
# Localmemcache: HEAD at 2009/07/14: 3121629016344dfd10f7533ca8ec68a0006cca21
|
27
|
+
# Tokyo Cabinet: 1.4.29
|
28
|
+
# Tokyo Cabinet Ruby: 1.27
|
27
29
|
#
|
28
|
-
# NOTE:
|
29
|
-
#
|
30
|
+
# NOTE:
|
31
|
+
# * groonga, Localmemcache and Tokyo Cabinet are built with "-O3" option.
|
32
|
+
# * Ruby bindings of them are built with "-O2" option.
|
30
33
|
|
31
34
|
require File.join(File.dirname(__FILE__), "common.rb")
|
32
35
|
|
@@ -99,9 +102,9 @@ begin
|
|
99
102
|
require 'localmemcache'
|
100
103
|
|
101
104
|
item("Localmemcache: file") do
|
102
|
-
LocalMemCache.drop(:namespace => "read-write-small-
|
105
|
+
LocalMemCache.drop(:namespace => "read-write-many-small-items",
|
103
106
|
:force => true)
|
104
|
-
@db = LocalMemCache.new(:namespace => "read-write-small-
|
107
|
+
@db = LocalMemCache.new(:namespace => "read-write-many-small-items")
|
105
108
|
values.each do |value|
|
106
109
|
@db[value] = value
|
107
110
|
@db[value]
|
@@ -3,30 +3,33 @@
|
|
3
3
|
# This benchmark is based on Tokyo Cabinet's benchmark at
|
4
4
|
# http://alpha.mixi.co.jp/blog/?p=791
|
5
5
|
#
|
6
|
-
# On my environment at 2009/
|
7
|
-
# % for x in {0..9}; do ruby benchmark/write-small-
|
6
|
+
# On my environment at 2009/07/14:
|
7
|
+
# % for x in {0..9}; do ruby benchmark/write-many-small-items.rb $x; done
|
8
8
|
# user system total real memory
|
9
|
-
# Hash
|
10
|
-
# groonga: Hash: memory 0.
|
11
|
-
# groonga: Trie: memory
|
12
|
-
# groonga: Hash: file 0.
|
13
|
-
# groonga: Trie: file
|
14
|
-
# Localmemcache: file
|
15
|
-
# TC: Hash: memory 0.
|
16
|
-
# TC: Tree: memory 0.
|
17
|
-
# TC: Hash: file 1.
|
18
|
-
# TC: Tree: file
|
9
|
+
# Hash 0.650000 0.130000 0.780000 ( 0.799843) 46.957MB
|
10
|
+
# groonga: Hash: memory 0.650000 0.130000 0.780000 ( 0.781058) 23.477MB
|
11
|
+
# groonga: Trie: memory 0.690000 0.180000 0.870000 ( 0.862132) 15.516MB
|
12
|
+
# groonga: Hash: file 0.660000 0.120000 0.780000 ( 0.780952) 23.480MB
|
13
|
+
# groonga: Trie: file 0.660000 0.190000 0.850000 ( 0.867515) 15.520MB
|
14
|
+
# Localmemcache: file 0.900000 0.150000 1.050000 ( 1.052692) 39.312MB
|
15
|
+
# TC: Hash: memory 0.480000 0.150000 0.630000 ( 0.636297) 42.062MB
|
16
|
+
# TC: Tree: memory 0.440000 0.150000 0.590000 ( 0.593117) 30.570MB
|
17
|
+
# TC: Hash: file 1.000000 1.820000 2.820000 ( 2.989515) 2.160MB
|
18
|
+
# TC: Tree: file 0.720000 0.130000 0.850000 ( 0.877557) 6.102MB
|
19
19
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
20
|
+
# CPU: Intel(R) Core(TM)2 Duo 2.33GHz
|
21
|
+
# Memory: 2GB
|
22
|
+
# Ruby: Debian GNU/Linux sid at 2009/07/14:
|
23
|
+
# ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]
|
24
|
+
# groonga: HEAD at 2009/07/14: fdaf58df5dd0195c10624eabee3e3f522f4af3f9
|
25
|
+
# Ruby/Groonga: trunk at 2009/07/14: r479
|
26
|
+
# Localmemcache: HEAD at 2009/07/14: 3121629016344dfd10f7533ca8ec68a0006cca21
|
27
|
+
# Tokyo Cabinet: 1.4.29
|
28
|
+
# Tokyo Cabinet Ruby: 1.27
|
27
29
|
#
|
28
|
-
# NOTE:
|
29
|
-
#
|
30
|
+
# NOTE:
|
31
|
+
# * groonga, Localmemcache and Tokyo Cabinet are built with "-O3" option.
|
32
|
+
# * Ruby bindings of them are built with "-O2" option.
|
30
33
|
|
31
34
|
require File.join(File.dirname(__FILE__), "common.rb")
|
32
35
|
|
@@ -94,8 +97,8 @@ begin
|
|
94
97
|
require 'localmemcache'
|
95
98
|
|
96
99
|
item("Localmemcache: file") do
|
97
|
-
LocalMemCache.drop(:namespace => "write-small-
|
98
|
-
@db = LocalMemCache.new(:namespace => "write-small-
|
100
|
+
LocalMemCache.drop(:namespace => "write-many-small-items", :force => true)
|
101
|
+
@db = LocalMemCache.new(:namespace => "write-many-small-items")
|
99
102
|
values.each do |value|
|
100
103
|
@db[value] = value
|
101
104
|
end
|
data/example/bookmark.rb
CHANGED
@@ -1,14 +1,32 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
base_dir = File.join(File.dirname(__FILE__), "..")
|
5
|
+
groonga_ext_dir = File.join(base_dir, 'ext')
|
6
|
+
groonga_lib_dir = File.join(base_dir, 'lib')
|
7
|
+
$LOAD_PATH.unshift(groonga_ext_dir)
|
8
|
+
$LOAD_PATH.unshift(groonga_lib_dir)
|
9
|
+
|
10
|
+
begin
|
11
|
+
require "groonga"
|
12
|
+
rescue LoadError
|
13
|
+
require "rubygems"
|
14
|
+
require "groonga"
|
15
|
+
end
|
6
16
|
|
7
17
|
$KCODE = "UTF-8"
|
8
18
|
Groonga::Context.default_options = {:encoding => :utf8}
|
9
19
|
|
10
20
|
path = ARGV[0]
|
11
|
-
|
21
|
+
if path.nil?
|
22
|
+
require 'tmpdir'
|
23
|
+
require 'fileutils'
|
24
|
+
temporary_directory = File.join(Dir.tmpdir, "ruby-groonga")
|
25
|
+
FileUtils.mkdir_p(temporary_directory)
|
26
|
+
at_exit {FileUtils.rm_rf(temporary_directory)}
|
27
|
+
path = File.join(temporary_directory, "db")
|
28
|
+
end
|
29
|
+
persistent = true
|
12
30
|
|
13
31
|
p Groonga::Database.create(:path => path)
|
14
32
|
|
@@ -79,8 +97,34 @@ p add_bookmark("http://practical-scheme.net/docs/cont-j.html",
|
|
79
97
|
"なんでも継続", "taporobo", "トランポリン LISP continuation",
|
80
98
|
1187568692)
|
81
99
|
|
82
|
-
|
100
|
+
|
101
|
+
records = comments.select do |record|
|
102
|
+
record["content"] =~ "LISP"
|
103
|
+
end
|
104
|
+
|
105
|
+
records.each do |record|
|
106
|
+
record = record.key
|
107
|
+
p [record.id,
|
108
|
+
record[".issued"],
|
109
|
+
record[".item.title"],
|
110
|
+
record[".author.name"],
|
111
|
+
record[".content"]]
|
112
|
+
end
|
113
|
+
|
114
|
+
p records
|
115
|
+
|
116
|
+
records.sort([{:key => ".issued", :order => "descending"}]).each do |record|
|
83
117
|
record = record.key
|
84
|
-
p [record
|
118
|
+
p [record.id,
|
119
|
+
record[".issued"],
|
120
|
+
record[".item.title"],
|
121
|
+
record[".author.name"],
|
85
122
|
record[".content"]]
|
86
123
|
end
|
124
|
+
|
125
|
+
records.group([".item"]).each do |record|
|
126
|
+
item = record.key
|
127
|
+
p [record[".:nsubrecs"],
|
128
|
+
item.key,
|
129
|
+
item[".title"]]
|
130
|
+
end
|