Masaharu YOSHIOKA
yoshi****@ist*****
2013年 7月 9日 (火) 14:04:34 JST
北大の吉岡と申します。
rroongaを利用しているのですが、UInt8,Uint16を利用した場合に、予想外の
挙動を示しますので、報告いたします。
まず、利用しているソフトウェアのバージョンは以下の通りです。
> ruby -v
ruby 1.9.3p429 (2013-05-15) [x86_64-linux]
> groonga --version
groonga 3.0.4 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,zlib,lzo,epoll]
> gem list rroonga
*** LOCAL GEMS ***
rroonga (3.0.4, 3.0.2)
ここで、以下のようなコードを実行した際に、
データの数が多くなった段階で、UInt8,UInt16などの返り値がおかしくなりま
す。
具体的には、_idにひきずられているようで、UInt8の場合は、256(2^8)以上、
UInt16の場合は、65536(2^16)以上で、本来の値の範囲以外の値が出力されま
す。
#groongaで直接データを見た場合には、適切な値が設定されていることが
#確認できています。
IDが 65536 の場合には、Uint8でもUIt16で、共に0を設定しても、同じく、
65536という値が返ることから、一貫して、_idの上位ビットの値が追加されて
いるように思われます。
データの数を増やしていないので、何とも言えませんが、もしかすると、
UInt32も2^32個のデータを登録すると、おかしな値を出すのかも知れません。
こちらのソフトウェアのバージョンなどによる問題かもしれませんが、ご確認
のほど、よろしくお願いします。
#!/usr/local/bin/ruby
# encoding: utf-8
require 'rubygems'
require 'groonga'
dbName = ARGV.shift or exit
Groonga::Context.default_options = {:encoding => :utf8}
Groonga::Database.create(:path => dbName)
Groonga::Schema.create_table("test", {:type => :hash} ){|table|
table.unsigned_integer8("int8")
table.unsigned_integer8("int82")
table.unsigned_integer16("int16")
table.unsigned_integer32("int32")
}
testTable = Groonga["test"]
(0..70000).each{|i|
testTable.add("ABC#{i}", :int8 => i % 256 , :int82 => 1, :int16 => i % 65536, :int32 => i)
}
testTable.select.each{|elem|
puts [elem._key, elem.int8, elem.int8 % 256, elem.int82, elem.int82 % 256, elem.int16, elem.int16 % 65536, elem.int32].join (",")
}
北海道大学大学院情報科学研究科コンピュータサイエンス専攻 准教授
〒060-0814 北海道札幌市北区北14条西9丁目
吉岡 真治 e-mail: yoshi****@ist*****
URL: http://www-kb.ist.hokudai.ac.jp/~yoshioka/