27 May 2016

前言

最近,涉及插入十几万条数据,直接使用 ActiveRecord 的 create 方法,超慢的。找了 ActiveRecord-import 方法。尝试了一下,快了不少。

def import_countries
  country_file = Rails.root.join('db/data', 'country.csv').to_s

  countries = []

  CSV.foreach country_file do |row|
    country = Country.new name: row[2], code: row[3], name_en: row[1].gsub(/^\s+|\s+$/, '') # 去除投和尾的空格
    puts country
    countries << country
  end

  Country.import countries
end

def create_countries
  country_file = Rails.root.join('db/data', 'country.csv').to_s

  countries = []

  CSV.foreach country_file do |row|
    country = {
        name: row[2],
        code: row[3],
        name_en: row[1].gsub(/^\s+|\s+$/, '') # 去除投和尾的空格
    }

    puts country
    countries << country
  end

  Country.create countries
end

def prof(&block)
  start_time = Time.now

  if block_given?
    block.call
  end

  cost_time = Time.now - start_time

  puts "Cost Time is: #{cost_time} s"
end

prof do 
  import_countries # Cost Time is: 1.692939 s
end
  
prof do 
  create_countries # 0.241883 s
end 

后记

批量插入数据,使用了 postgresql 支持的批量将数据插入内置方法,非常的方便。

同时插入,一万条数据以上的,在网络状况不好的情况下,会引发 Network Timeout 时间。 后来,发现还是自己的本地的网络的状况不太好。

from /Users/xiajian/.rvm/gems/ruby-2.3.0@camp/gems/activerecord-4.2.5/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec'



傲娇的使用Disqus