3

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

1 回答 1

5

请参阅sqlite 的常见问题解答“INSERT 真的很慢 - 我每秒只能执行几十个 INSERT”

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

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

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

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

于 2012-09-25T13:01:22.997 回答