rails:1370
From: kAZUO tAKAYAMA <kazuot@m...>
Date: Fri, 21 Jul 2006 06:39:41 +0900
Subject: [rails:1370] バルクインサートの処理速度について
はじめまして高山と申します。
サーバにアップロードしたCSVファイルを読み込んでテーブルにインポートする処理を
下記のように書いたのですが、処理速度が遅くて困っています。1000件程度のデータ
をインポートするのに20秒近くかかってしまいます。
_f = File.new("#{UPLOAD_PATH}/data.csv}",'r')
while _line = _f.gets
_cols = _line.split(/,/)
_data = Uploaddata.new
_data.col1 = _cols[0]
_data.col2 = _cols[1]
_data.col3 = _cols[2]
:
:
if !_data.save then
break;
end
end
そこで、execute()を使うよう書き直してみたのですがスマートじゃないように思いま
す。Railsでもexecute()は推奨されていないようだし、もう少しすっきり速くバルク
インサートを実現する方法はないものでしょうか?
書き直した結果は約10秒程度でインポートできましたので効果はあったですが...
# rails(1.1.4)
# activerecord (1.14.3)
# MySQL(5.0.18)
です。
_f = File.new("#{UPLOAD_PATH}/data.csv}",'r')
ActiveRecord::Base.connection.execute('set autocommit=0')
ActiveRecord::Base.connection.execute('start transaction')
while _line = _f.gets
_cols = _line.split(/,/)
_data = Uploaddata.new
_data.col1 = _cols[0]
_data.col2 = _cols[1]
_data.col3 = _cols[2]
:
:
#get_insert_query() はinsert into table(...) values(...)を返します
ActiveRecord::Base.connection.execute("#{_data.get_insert_query}")
end
ActiveRecord::Base.connection.execute('commit')
--
ML: rails@r...
使い方: http://QuickML.com/
-> 1370 2006-07-20 23:39 [kazuot@m... ] バルクインサートの処理速度について 1371 2006-07-21 00:22 ┣[walf443@g... ] 1372 2006-07-21 00:25 ┗[moriq@m... ] 1381 2006-07-21 13:36 ┗[kazuot@m... ]