Выполнение огромных миграций данных в рельсах

Я испытываю большие трудности с временем и вычислительной мощностью при переносе больших данных (несколько 100 000 строк). Я разрабатываю сервис, который обрабатывает много данных в рельсах. Наши модели постоянно меняются, поскольку мы все больше и больше разбираемся в дизайне. Это приводит к множеству миграций в нашей базе данных, которая является базой данных Postgres 9.0. Часто эти миграции также включают в себя некоторую миграцию самих данных. Вчера мы узнали, что нам нужно переместить атрибут «текст» в модели в отдельную модель, чтобы атрибут больше не был просто атрибутом в модели, а вместо этого являлся отношением «один ко многим».

Моя миграция выглядела несколько как this:

def self.up
  create_table :car_descriptions do |t|
    t.integer :car_id
    t.text :description

    t.timestamps
  end

  Car.find_each do |car|
    if car.description.present?
      car.descriptions.build :description => car.description
    end
    car.save
  end
  remove_column :cars, :description
end

Теперь проблема в том, что это происходит довольно медленно, и что еще хуже, если я установлю счетчик и распечатаю прогресс, я могу увидеть, что миграция выполняется все медленнее и медленнее с течением времени. В моем мониторе активности я вижу, что процесс ruby ​​занимает все больше и больше памяти.

Итак, мой вопрос - есть ли лучший способ выполнить такую ​​миграцию больших данных?

7
задан Niels Kristian 28 July 2011 в 15:04
поделиться