warning: I know nothing about Ruby.

On 9/22/08, Gavin Kistner <[EMAIL PROTECTED]> wrote:
> (Right off the bat, let me say that I'm not sure if the problem here
>  is Sequel, sqlite3-ruby, or
>  sqlite. Just in case...)
>
>  I have a Ruby script to migrate data from an old sqlite DB to a new
>  schema. It's quite simple, selecting rows from db 1 and creating
>  records in db 2. (A rough representation of the script is at the end
>  of this post.)

I am assuming you have good reason to not just ATTACH the old db to
the new db and INSERT INTO new_table SELECT * FROM old_db.old_table

Seems tedious to use Ruby to do this.

>
>  This script transforms a 2MB sqlite DB with about 5,000 rows into a
>  1.8MB sqlite DB with about the same number of rows. (A few fields and
>  tables get dropped along the way.)
>
>  On my mac laptop at home (2.3GHz Core 2 Duo, 2GB RAM, 5400 RPM drive)
>  this script runs in 22 seconds. In 'better battery life' mode.

All that said, 22 seconds for a 5000 row db on that machine (same as
my laptop) seems rather slow to me.

>
>  On my XP desktop at work (2GHz Dual Pentium, 2GB RAM, 7000 RPM drive)
>  this same script on the same DB runs in 11 minutes. 30x slower.
>
>  It's the same version of Ruby (1.8.6 p111), same version of sqlite3
>  (3.6.2), sqlite3-ruby (1.2.3), and same version of Sequel (2.5.0). I
>  know that the One-Click Installer of Ruby I'm using on XP isn't as
>  fast as some other builds, but 30x slower seems crazy.
>
>  If I turn off DB journaling on SQLite on Windows, I can get it down
>  from 11 minutes to 4 minutes. Only
>  12x slower than the Mac. (But then, the Mac also runs faster without
>  journaling.)
>
>  The only funky thing that I can point to is that the script uses two
>  different ORMs (sqlite3-ruby on db 1 and Sequel on db 2). I don't have
>  a really good reason for this, it's just how it happened to have been
>  written. If
>  this slowdown ever becomes a big issue I could try Sequel for both and
>  see if that helps in any way.
>
>  Mostly I'm sharing this as a curiosity, though I'm quite interested if
>  anyone has a suggestion on why
>  this might be so much slower on a roughly equivalent machine differing
>  only in OS.
>
>  Here's (roughly) what the script looks like:
>
>    require 'rubygems'
>    require 'sqlite3'
>    require 'sequel'
>
>    olddb = SQLite3::Database.new( OLD_FILE )
>    olddb.results_as_hash = true
>
>    newdb = Sequel.sqlite( NEW_FILE )
>    newdb << IO.read( NEW_SCHEMA )
>
>    # Do the following sort of thing for about 10 different tables
>    new_table = newdb[ :users ]
>    olddb.execute "SELECT * FROM users" do |user|
>      new_table << {
>        :id        => user['id'].to_i,
>        :name      => user['name'],
>        :active    => user['active']=='yes',
>        :email     => user['email']
>      }
>    end
>
>  (As you might expect, this results in a SELECT from one DB followed by
>  N independent un-transactioned INSERTs run on the other DB.)
>
>  _______________________________________________
>  sqlite-users mailing list
>  sqlite-users@sqlite.org
>  http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>


-- 
Puneet Kishor
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to