Rails rake任务令人难以置信的缓慢

时间:2015-09-18 08:30:47

标签: ruby-on-rails rake

我在rails中编写了一个rake任务,用gender值更新我的用户数据库。它应该做的就是遍历我的用户并使用我从性别检测中获得的值更新性别属性"宝石(运作良好)。

rake任务现在运行几分钟,尽管我的数据库中只有几十条记录:

require 'gender_detector'

namespace :user do
  desc 'Assign gender to all users'
  task :genderize => :environment do

    User.all.each do |user|
      gd = GenderDetector.new(:case_sensitive => false)
      gender = gd.get_gender(user.firstname)

      sql = "UPDATE users SET gender = '#{gender}' WHERE id = #{user.id}"
      ActiveRecord::Base.connection.execute(sql)
    end

  end
end

我做错了什么?

2 个答案:

答案 0 :(得分:2)

rake任务中有几个组件:rails boot,database,genderdetector等。您应该隔离每个组件并对其进行基准测试,以了解瓶颈是什么。

根据您拥有的宝石数量,Rails环境可能需要几秒钟到一分钟才能预订。因此,:environment要求可能会降低您的任务速度。

我不知道GenderDetector做了什么以及它如何在内部工作。例如,如果它查询Web服务,IO也可能会降低您的任务速度。

最后,您还可以优化查询,以避免从数据库中加载不必要的数据。

require 'gender_detector'

namespace :user do
  desc 'Assign gender to all users'
  task :genderize => :environment do

    User.select('id, firstname').each do |user|
      gd = GenderDetector.new(:case_sensitive => false)
      gender = gd.get_gender(user.firstname)

      User.update_all({ gender: gender }, user_id: user.id)
    end

  end
end

答案 1 :(得分:-1)

因为要更新每个用户,所以对数据库使用单独的查询。