下面是从 Internet 下载大约 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 行这样的行,我怎样才能通过组合所有这些来进行插入并只调用一次该过程。此外,mysql 是否支持数组和迭代在例程中做这样的事情。请提出您的建议。谢谢。
编辑
我必须根据它们是否已经存在来插入表,我还需要在插入表之前使用条件比较。我肯定不会为这些写SQL语句,所以我写了SQL存储过程。现在我有一个列表@the_data,我如何将它传递给过程,然后在 MySQL 端遍历它。有任何想法吗 ?
insert into mfmodel.company_masters (company_name) values
#{@the_data.map {|str| "('#{str[0]}')"}.join(',')}
这进行了 100 次插入,但其中 35 次是多余的,因此我需要在插入之前在表中搜索现有条目。
有任何想法吗 ?谢谢