У меня довольно большое сканирование миграции с использованием таблицы строк по 300 КБ с использованием find_each и batch_size 1000. Для выполнения миграции требуется около двух часов, и для каждой строки создается новая строка в другой таблице.Я не могу использовать чистый SQL для этой миграции - это должен быть Ruby.
Мой вопрос, однако, почему Ruby сначала использует всю доступную память, а затем начинает использовать безумные объемы подкачки (35 ГБ))?(См. Скриншоты, которые прилагаются.) Я бы подумал, что Ruby GC будет вызван до того, как он начнет есть своп.В конце концов, теоретически только 1000 записей должны быть загружены в память одновременно.И эти записи небольшие, гораздо меньше, чем 1 МБ.Что я делаю не так?
![enter image description here](https://i.stack.imgur.com/86Dbi.png)
![enter image description here](https://i.stack.imgur.com/zpUxu.png)
ОБНОВЛЕНИЕ: вот пример кода
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