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の FAQ を参照してください。

つまり、次の 2 つの方法で sqlite を高速化できます。

  • 複数の INSERT ステートメントを BEGIN...COMMIT でグループ化して、挿入を 1 つのトランザクションにします。Ruby では、次のようにする必要があります。

    database.transaction do |db| db.execute( "insert into table values ( 'a', 'b', 'c' )" ) ... end 
    
  • または、単純に PRAGMA synchronous=OFF を実行します。

また、文を実行する前に文を準備することを忘れないでください。

于 2012-09-25T13:01:22.997 に答える