Производительность миграции Rails: использовать 35 ГБ подкачки? - PullRequest
1 голос
/ 21 января 2012

У меня довольно большое сканирование миграции с использованием таблицы строк по 300 КБ с использованием find_each и batch_size 1000. Для выполнения миграции требуется около двух часов, и для каждой строки создается новая строка в другой таблице.Я не могу использовать чистый SQL для этой миграции - это должен быть Ruby.

Мой вопрос, однако, почему Ruby сначала использует всю доступную память, а затем начинает использовать безумные объемы подкачки (35 ГБ))?(См. Скриншоты, которые прилагаются.) Я бы подумал, что Ruby GC будет вызван до того, как он начнет есть своп.В конце концов, теоретически только 1000 записей должны быть загружены в память одновременно.И эти записи небольшие, гораздо меньше, чем 1 МБ.Что я делаю не так?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...