[前][次][番号順一覧][スレッド一覧]

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...         ]