Rails rake 任务难以置信的慢

Rails rake task incredible slow

我在 rails 中编写了一个 rake 任务,用 gender 值更新我的用户数据库。它应该做的就是遍历我的用户并使用我从 "gender detection" gem 中获得的值更新性别属性(效果很好)。

尽管我的数据库中只有几十条记录,但 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

我做错了什么?

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

rake 任务中有几个组件:rails 引导、数据库、性别检测器等。您应该隔离每个组件并对其进行基准测试,以了解瓶颈所在。

根据您拥有的宝石数量,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