以下は、インターネットから約9000行のtxtファイルをダウンロードしてデータベースに入力するコードです。多くのことを試しましたが、7分以上かかります。win 7 64 ビットと ruby 1.9.3 を使用しています。速くする方法はありますか??
require 'open-uri'
require 'dbi'
dbh = DBI.connect("DBI:Mysql:mfmodel:localhost","root","")
#file = open('http://www.amfiindia.com/spages/NAV0.txt')
file = File.open('test.txt','r')
lines = file.lines
2.times { lines.next }
curSubType = ''
curType = ''
curCompName = ''
lines.each do |line|
line.strip!
if line[-1] == ')'
curType,curSubType = line.split('(')
curSubType.chop!
elsif line[-4..-1] == 'Fund'
curCompName = line.split(" Mutual Fund")[0]
elsif line == ''
next
else
sCode,isin_div,isin_re,sName,nav,rePrice,salePrice,date = line.split(';')
sCode = Integer(sCode)
sth = dbh.prepare "call mfmodel.populate(?,?,?,?,?,?,?)"
sth.execute curCompName,curSubType,curType,sCode,isin_div,isin_re,sName
end
end
dbh.do "commit"
dbh.disconnect
file.close
106799;-;-;HDFC ARBITRAGE FUND RETAIL PLAN DIVIDEND OPTION;10.352;10.3;10.352;29-Jun-2012
これは、テーブルに挿入されるデータの形式です。現在、そのような行は 8000 行あります。これらすべてを組み合わせて挿入し、プロシージャを 1 回だけ呼び出すにはどうすればよいでしょうか。また、mysqlはルーチン内でそのようなことを行うために配列と反復をサポートしていますか? 提案をお願いします。ありがとうございます。
編集
テーブルが既に存在するかどうかに応じて、テーブルに挿入する必要があります。また、テーブルに挿入する前に条件付き比較を使用する必要があります。これらの SQL ステートメントを書くことは絶対にできないので、SQL ストアド プロシージャを作成しました。これで @the_data というリストができました。それをプロシージャに渡し、MySQL 側ですべてを反復するにはどうすればよいでしょうか。何か案は ?
insert into mfmodel.company_masters (company_name) values
#{@the_data.map {|str| "('#{str[0]}')"}.join(',')}
これにより 100 回の挿入が行われますが、そのうちの 35 回は冗長であるため、挿入を行う前にテーブルで既存のエントリを検索する必要があります。
何か案は ?ありがとう