sea*_*cal 8 ruby activerecord ruby-on-rails-4
我正在使用Rails 4.0.0和Ruby 2.0.0.我Post(在博客文章中)模型与具有用户的user_name,first_name,last_name的组合的用户相关联.我想迁移数据,以便帖子通过外键与用户关联,这是用户的ID.
我在posts表中有大约1100万条记录.
我正在运行以下代码来使用Linux服务器上的rake任务来迁移数据.但是,我的任务一直被服务器"杀死",可能是由于rake任务,特别是下面的代码,消耗了太多内存.
我发现降低batch_size到20并增加sleep(10)以sleep(60)允许任务运行更长时间,更新更多记录而不被杀死,但需要更多时间.
如何针对速度和内存使用优化此代码?
Post.where(user_id: nil).find_in_batches(batch_size: 1000) do |posts|
puts "*** Updating batch beginning with post #{posts.first.id}..."
sleep(10) # Hopefully, saving some memory usage.
posts.each do |post|
begin
user = User.find_by(user_name: post.user_name, first_name: post.first_name, last_name: post.last_name)
post.update(user_id: user.id)
rescue NoMethodError => error # user could be nil, so user.id will raise a NoMethodError
puts "No user found."
end
end
puts "*** Finished batch."
end
Run Code Online (Sandbox Code Playgroud)
z5h*_*z5h 10
在数据库中完成比在前后移动数据更快的工作.
这可以使用ActiveRecord完成.当然请在重要数据释放之前对此进行测试.
Post
.where(user_id: nil)
.joins("inner join users on posts.user_name = users.user_name")
.update_all("posts.user_id = users.id")
Run Code Online (Sandbox Code Playgroud)
此外,如果帖子上有索引user_id,并且用户有索引user_name,那么这将有助于此特定查询更快地运行.
| 归档时间: |
|
| 查看次数: |
3339 次 |
| 最近记录: |