【问题标题】:Rake task too slowRake 任务太慢
【发布时间】:2012-11-04 09:49:54
【问题描述】:

我有一个 rake 任务,它将几个表中的所有信息汇总到一个表中,每个表大约有 200 000 行:

task :migrate_all_info_tables_to_one => :environment do
    profiles = Profile.all
    profiles.each do |profile|
      basic_info_items = profile.basic_info_items
      basic_info_items.each do |item|
        info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'info', :value => item.parameter, :link => item.link != 'none' ? item.link : nil, :description => item.value)
        profile.info_items << info
      end

      cities = profile.cities
      cities.each do |city|
        city = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'city', :value => city.title, :link => city.link != 'none' ? city.link : nil, :description => city.description)
        profile.info_items << city
      end

      histories = profile.histories
      histories.each do |item|
        info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'history', :value => item.year, :link => item.link != 'none' ? item.link : nil, :description => item.event)
        profile.info_items << info
      end

      contacts = profile.contacts
      contacts.each do |item|
        info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'contact', :value => item.parameter, :link => item.link != 'none' ? item.link : nil, :description => item.value)
        profile.info_items << info
      end
    end
  end

我在表中添加了所有必要的索引(使用 mysql 5.1.6),形成 mysql 每个单独的查询需要 0.00 秒,也来自 ruby​​ 控制台。但是当我运行这个 rake 任务时,它每分钟只处理 100 个配置文件记录,为什么或者我做错了什么?

P.S:我这样做是因为我在项目数据库架构中犯了一个错误。

【问题讨论】:

  • 您是否对其进行了分析以查看花费的时间?

标签: mysql ruby-on-rails ruby performance rake


【解决方案1】:

为了提高效率,您可以预先加载您在脚本中使用的配置文件关系,使用:

Profile.includes(:basic_info_items, :cities, :histories, :contacts).all

而不是Profile.all

您可能还想使用Profile.find_each 而不是Profile.all 以避免将所有配置文件加载到内存中。

【讨论】:

    【解决方案2】:

    如果您在 Profile 上有相关记录,并且在遍历所有配置文件时访问它们,ActiveRecord 可能会为每个配置文件单独选择,并使用 BEGIN 和 COMMIT 完成。即使每次选择非常快,这也会减慢速度。

    http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

    查看有关预加载关联的部分。

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 2014-02-19
      • 2013-06-15
      • 2010-10-09
      • 2017-10-04
      • 2013-01-22
      • 2020-09-22
      • 2013-05-12
      • 2014-12-05
      相关资源
      最近更新 更多