使用ruby创建sqlite数据库花费的时间太长

使用ruby创建sqlite数据库花费的时间太长,ruby,sqlite,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" # t

我正在使用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
...   

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

  • 使用BEGIN…COMMIT对多个INSERT语句进行分组,以便将INSERT语句插入到一个事务中。在ruby中,您应该执行以下操作:

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

并记住在执行之前准备好语句