Rails迁移性能:使用35GB的交换?

时间:2012-01-21 02:40:41

标签: ruby-on-rails ruby-on-rails-3.1

我有一个非常大的迁移扫描通过一个300k行的表,使用find_each和一个1000的batch_size。迁移大约需要两个小时来运行,并且对于每一行,在另一个表中创建一个新行。我不能使用纯SQL来执行此迁移 - 它必须是Ruby。

我的问题是,为什么Ruby首先耗尽所有可用内存然后开始使用疯狂的交换量(35GB)? (参见随附的屏幕截图。)我原本以为Ruby的GC会在开始吃掉之前被调用过。毕竟,理论上一次只能将1000条记录加载到内存中。而这些记录很小,远小于1MB。我做错了什么?

enter image description here

enter image description here

更新:这是一些示例代码

Post.find_each(:batch_size => 1000) do |p|
  user = User.find_by_fb_id(p.fb_uid)
  if user
    puts "Migrating post #{p.pid}"
    e = Entity.new
    e.created_at = p.time
    e.updated_at = p.last_update
    e.response = p.post
    e.user_id = user.id
    e.legacy_type = "GamePost"
    e.legacy_id = p.pid
    e.is_approved = true
    e.is_muted = true
    e.save(:validate => false)
  end
end

0 个答案:

没有答案