image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« 2008年11月7日 | トップページ | 2008年11月9日 »

2008年11月8日

2008-11-08

jruby と ruby での DB アクセスの速度

- http://www.tuyudaku.net/sqlite/import.html
> SQLite - CSVファイルのインポート
を参考にして、 sqlite3 に郵便番号を import した。
# activerecord で扱うための、テーブル名を zip でなく、zips になるように変更して。

ruby と jruby の両方で、簡単な検索プログラムを書いて、速度を比較してみた。

$ cat search.rb
#See http://d.hatena.ne.jp/urekat/20080923/1222169086

require 'pp'
require 'rubygems'
require 'active_record'
require 'nkf'

# ログを stderrに出す
# ActiveRecord::Base.logger = Logger.new($stderr)
# ログをファイルに出す
#ActiveRecord::Base.logger = Logger.new("debug.log")

ActiveRecord::Base.establish_connection(
  :adapter  => "sqlite3",
  :database => "zips.db",
  :timeout  => 5000
)

class Zip < ActiveRecord::Base
  def to_s
    return  "#{col1}|#{col2}|#{col3}|#{col4.toutf8}|#{col5.toutf8}|#{col6.toutf8}|#{col7.toutf8}|#{col8.toutf8}|#{col9.toutf8}|#{col10}|#{col11}|#{col12}|#{col13}|#{col14}|#{col15}"
  end
end

puts Zip.find(:all, :conditions => ["col3 like ?", '100000%'])

$ cat jsearch.rb
# See http://d.hatena.ne.jp/urekat/20080923/1222169086

require 'pp'
require 'rubygems'
require 'active_record'
# require 'kconv'
# SJIS 出力したいなら、str.kconv(Kconv::SJIS, Kconv::UTF8) などとすること。

# ログを stderrに出す
# ActiveRecord::Base.logger = Logger.new($stderr)
# ログをファイルに出す
#ActiveRecord::Base.logger = Logger.new("debug.log")

ActiveRecord::Base.establish_connection(
  :adapter  => "jdbcsqlite3",
  :database => "zips.db",
  :timeout  => 5000
)

class Zip < ActiveRecord::Base
  def to_s
    return  "#{col1}|#{col2}|#{col3}|#{col4}|#{col5}|#{col6}|#{col7}|#{col8}|#{col9}|#{col10}|#{col11}|#{col12}|#{col13}|#{col14}|#{col15}" # .kconv(Kconv::SJIS, Kconv::UTF8)
  end
end

puts Zip.find(:all, :conditions => ["col3 like ?", '100000%'])

$ time ruby search.rb
13101|100  |1000000|トウキョウト|チヨダク|イカニケイサイガナイバアイ|東京都|千代田区|以下に掲載がない場合|0|0|0|0|0|0
13101|100  |1000004|トウキョウト|チヨダク|オオテマチ|東京都|千代田区|大手町|0|0|1|0|0|0
13101|100  |1000002|トウキョウト|チヨダク|コウキョガイエン|東京都|千代田区|皇居外苑|0|0|0|0|0|0
13101|100  |1000001|トウキョウト|チヨダク|チヨダ|東京都|千代田区|千代田|0|0|0|0|0|0
13101|100  |1000003|トウキョウト|チヨダク|ヒトツバシ(1チョウメ)|東京都|千代田区|一ツ橋(1丁目)|1|0|1|0|0|0
13101|100  |1000005|トウキョウト|チヨダク|マルノウチ(ツギノビルヲノゾク)|東京都|千代田区|丸の内(次のビルを除く)|0|0|1|0|0|0
13101|100  |1000006|トウキョウト|チヨダク|ユウラクチョウ|東京都|千代田区|有楽町|0|0|1|0|0|0

real    0m0.774s
user    0m0.559s
sys    0m0.210s

$ time jruby jserach.rb
13101|100  |1000000|トウキョウト|チヨダク|イカニケイサイガナイバアイ|東京都|千代田区|以下に掲載がない場合|0|0|0|0|0|0
13101|100  |1000004|トウキョウト|チヨダク|オオテマチ|東京都|千代田区|大手町|0|0|1|0|0|0
13101|100  |1000002|トウキョウト|チヨダク|コウキョガイエン|東京都|千代田区|皇居外苑|0|0|0|0|0|0
13101|100  |1000001|トウキョウト|チヨダク|チヨダ|東京都|千代田区|千代田|0|0|0|0|0|0
13101|100  |1000003|トウキョウト|チヨダク|ヒトツバシ(1チョウメ)|東京都|千代田区|一ツ橋(1丁目)|1|0|1|0|0|0
13101|100  |1000005|トウキョウト|チヨダク|マルノウチ(ツギノビルヲノゾク)|東京都|千代田区|丸の内(次のビルを除く)|0|0|1|0|0|0
13101|100  |1000006|トウキョウト|チヨダク|ユウラクチョウ|東京都|千代田区|有楽町|0|0|1|0|0|0

real    0m8.645s
user    0m7.928s
sys    0m0.472s

遅いぞ jruby!
ATOKダイレクトプラグインで、ruby + activerecord + sqlite3 は十分 使えそうだな。

ActiveRecord-JDBC で sqlite3 のアクセス

以前、jruby で Activerecord-jdbc で sqlite3 アクセスしようとした際は、
sqlite3 アダプターが無かったので、実現できずにいた。
たまたま、今日 sqlite3 アダプタができていることを知った。
- http://weblogs.java.net/blog/arungupta/archive/2008/07/totd_37_sqlite3.html
> Arun Gupta's Blog: TOTD #37: SQLite3 with Ruby-on-Rails on GlassFish Gem

そこで、ruby + activerecord + sqlite3 のプログラムを探し、次のサイトをみつけて、これを jruby + acriverecord0jdbc + sqlite3 に書き換えてみた。

まずは ruby 版。
$ cat ruby-01.rb
# See http://d.hatena.ne.jp/urekat/20080923/1222169086

require "pp"
require "rubygems"
require "active_record"

commands = <<END
ruby -v
which sqlite3
sqlite3 --version
gem list | grep sqlite3-ruby
gem list | grep activerecord
END
commands.each do |cmd|
  puts "'#{ cmd.strip}' => '#{`#{ cmd}`.strip}'"
end

ActiveRecord::Base.logger = Logger.new($stderr)
ActiveRecord::Base.establish_connection(
  :adapter  => "sqlite3",
  :database => "_sqlite3_ar_test.sqlite3",
  :timeout  => 5000
)

begin
  ActiveRecord::Migration.create_table :users do |t|
    t.column :name       , :string
    t.column :nickname   , :string
    t.column :profile    , :text
    t.column :created_at , :datetime
    t.column :updated_at , :datetime
  end
rescue
end

class User < ActiveRecord::Base
end

User.create(
  :name     => "sasaki takeru",
  :nickname => "urekat",
  :profile  => "hehe hoho."
)

puts "User.count=#{User.count}"
pp User.find(:all)

次が jruby 版。
$ cat jruby-01.rb
# See http://d.hatena.ne.jp/urekat/20080923/1222169086

require "pp"
require "rubygems"
require "active_record"

commands = <<END
jruby -v
which sqlite3
sqlite3 --version
jruby -S gem list | grep activerecord-jdbcsqlite3-adapter
jruby -S gem list | grep ActiveRecord-JDBC
END
commands.each do |cmd|
  puts "'#{ cmd.strip}' => '#{`#{ cmd}`.strip}'"
end

ActiveRecord::Base.logger = Logger.new($stderr)
ActiveRecord::Base.establish_connection(
  :adapter  => "jdbcsqlite3",
  :database => "_sqlite3_ar_test.sqlite3",
  :timeout  => 5000
)

begin
  ActiveRecord::Migration.create_table :users do |t|
    t.column :name       , :string
    t.column :nickname   , :string
    t.column :profile    , :text
    t.column :created_at , :datetime
    t.column :updated_at , :datetime
  end
rescue
end

class User < ActiveRecord::Base
end

User.create(
  :name     => "sasaki takeru",
  :nickname => "urekat",
  :profile  => "hehe hoho."
)

puts "User.count=#{User.count}"
pp User.find(:all)

では、走らせてみよう。

$ ruby ruby-01.rb
ruby -v' => 'ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9]'
'which sqlite3' => '/opt/local/bin/sqlite3'
'sqlite3 --version' => '3.6.4'
'gem list | grep sqlite3-ruby' => 'sqlite3-ruby (1.2.4)'
'gem list | grep activerecord' => 'activerecord (2.1.2, 2.1.0)
activerecord-jdbc-adapter (0.8.2)
activerecord-jdbcsqlite3-adapter (0.8.2)'
-- create_table(:users)
  SQL (0.000417)   select sqlite_version(*)
  SQL (0.003166)   CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "nickname" varchar(255), "profile" text, "created_at" datetime, "updated_at" datetime)
   -> 0.0382s
  User Create (0.000448)   INSERT INTO "users" ("name", "created_at", "profile", "nickname", "updated_at") VALUES('sasaki takeru', '2008-11-08 13:30:46', 'hehe hoho.', 'urekat', '2008-11-08 13:30:46')
  SQL (0.000230)   SELECT count(*) AS count_all FROM "users"
User.count=1
  User Load (0.000269)   SELECT * FROM "users"
[#<User id: 1, name: "sasaki takeru", nickname: "urekat", profile: "hehe hoho.", created_at: "2008-11-08 13:30:46", updated_at: "2008-11-08 13:30:46">]

続けて、jruby 版。
$ jruby jruby-01.rb
jruby -v' => 'jruby 1.1.5 (ruby 1.8.6 patchlevel 114) (2008-11-08 rev 6586) [i386-java]'
'which sqlite3' => '/opt/local/bin/sqlite3'
'sqlite3 --version' => '3.6.4'
'jruby -S gem list | grep activerecord-jdbcsqlite3-adapter' => 'activerecord-jdbcsqlite3-adapter (0.8.2)'
'jruby -S gem list | grep ActiveRecord-JDBC' => 'ActiveRecord-JDBC (0.5)'
-- create_table(:users)
  SQL (0.000000)   ActiveRecord::ActiveRecordError: table users already exists: CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name text(0), nickname text(0), profile text, created_at INTEGER, updated_at INTEGER)
  User Create (0.005822)   INSERT INTO users (name, nickname, profile, created_at, updated_at) VALUES('sasaki takeru', 'urekat', 'hehe hoho.', '2008-11-08 13:31:27', '2008-11-08 13:31:27')
  SQL (0.003723)   SELECT SEQ FROM SQLITE_SEQUENCE WHERE NAME = 'users'
  SQL (0.003101)   SELECT count(*) AS count_all FROM users
User.count=2
  User Load (0.006008)   SELECT * FROM users
[#<User id: 1, name: "sasaki takeru", nickname: "urekat", profile: "hehe hoho.", created_at: "2008-11-08 13:30:46", updated_at: "2008-11-08 13:30:46">,
#<User id: 2, name: "sasaki takeru", nickname: "urekat", profile: "hehe hoho.", created_at: "2008-11-08 13:31:27", updated_at: "2008-11-08 13:31:27">]

ちゃんと データ総数が増えている。

ピックアップ: IEへのWebKit採用に興味ある, JRuby 1.1.5 and Click 1.5, etc...

- http://jp.techcrunch.com/archives/20081107microsoft-probably-not-really-considering-webkit-for-ie/
> Microsoft、「IEへのWebKit採用に興味ある」―多分本気ではあるまいが

- http://www.heise-online.co.uk/open/Re-Versions-JRuby-1-1-5-and-Click-1-5--/news/111877
> Re:Versions - JRuby 1.1.5 and Click 1.5 - News - heise open source UK

- http://dj-expetition.blogspot.com/2008/06/activerecord-jdbc-now-supports-sqlite3.html
> gem install activerecord-jdbcsqlite3-adapter

« 2008年11月7日 | トップページ | 2008年11月9日 »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク