使用ruby创建sqlite数据库需要很长时间

时间:2012-09-25 12:11:25

标签: ruby sqlite

我使用sqlite-ruby将txt文件传输到sqlite3数据库,每个txt文件大约3,5 MB,ruby读取速度非常快,但填充数据库每个文件需要10分钟以上。我不知道这是否正常,我猜不是。有人可以告诉我一个更快的方法来做这个或者如果我做一些疯狂的事情吗?下面的代码和txt方案,谢谢。

编辑:每个文件超过30分钟......

require 'sqlite3'

db = SQLite3::Database.new( "firstTest.db" )

filename="file1.txt" # this file is 3.5 MB

streetArray=[]
mothertablename="tmother"
coordstablename="tcoords"

db.execute("create table '#{mothertablename}' (id INTEGER,stName TEXT,stBC TEXT,stPrice INTEGER,stUrl TEXT);")
db.execute("create table '#{coordstablename}' (id INTEGER,num INTEGER,xcoord DOUBLE,ycoord DOUBLE);")

f=[]
File.open("_history/" + "#{filename}").each{|line| f.push(line)}

counter=0

for i in 1...f.length
    f[i].gsub!("'","") #get rid of comma character
    ptsArray=f[i].split(';')

    if ptsArray[0]==ptsArray[1]
        streetArray.push(f[i])
    end

    if ptsArray[0]=="next\n"
        counter +=1
        namestreetArray=f[i-1].split(';')
        stname=nil
        stprice=nil
        stbc=nil
        sturl=nil
        if namestreetArray[0]=="name"
            stname=namestreetArray[1]
            if namestreetArray.length>2
                stprice=namestreetArray.last
            else
                stprice=nil
            end
        end

        db.execute(  "insert into '#{mothertablename}' (id, stName, stBC, stPrice, stUrl) 
        values ('#{counter}','#{stname}','#{stbc}','#{stprice}','#{sturl}');")

        localcounter=0

        streetArray.each do |coord|
            localcounter +=1
            xcoord=coord.split(";")[3].to_f
            ycoord=coord.split(";")[2].to_f
            db.execute(  "insert into '#{coordstablename}' (id, num, xcoord, ycoord) 
            values ('#{counter}','#{localcounter}','#{xcoord}','#{ycoord}');")
        end
        streetArray.clear
    end
end

这是txt方案

206358589;206358589;37.3907322;-5.9885633
195966401;195966401;37.3909862;-5.988974
195969491;195969491;37.3910908;-5.9891081
195969493;195969493;37.3911863;-5.9893141
195969494;195969494;37.3912954;-5.9895115
813726831;813726831;37.3914352;-5.98973
name;Calle Descalzos;3085
next
440230342;440230342;37.3918677;-5.9905477
813726823;813726823;37.3916168;-5.9905285
192037929;192037929;37.3916184;-5.9905125
195970140;195970140;37.391872;-5.990398
440230342;440230342;37.3918677;-5.9905477
next
192009475;192009475;37.3875271;-5.9937949
710633000;710633000;37.3875013;-5.9941761
name;Calle Felipe Perez;
next
195982576;195982576;37.387349;-5.9937755
308836571;308836571;37.3873649;-5.9936472
next
...   

1 个答案:

答案 0 :(得分:5)

请参阅faq of sqlite "INSERT is really slow - I can only do few dozen INSERTs per second"

简而言之,您可以通过两种方式加速sqlite:

  • 使用BEGIN ... COMMIT对多个INSERT语句进行分组,以便将插入插入到一个事务中。在ruby中,你应该做类似的事情:

    database.transaction do |db| db.execute( "insert into table values ( 'a', 'b', 'c' )" ) ... end 
    
  • 或者只是运行PRAGMA synchronous = OFF。

请记住在执行之前准备好声明。