estoy experimentando a lo grande y calculando desafíos de energía al hacer la migración de datos grande (varios 100.000 filas). Estoy desarrollando un servicio que maneja una gran cantidad de datos en rieles. Nuestros modelos cambian constantemente a medida que nos volvemos cada vez más exigentes con nuestro diseño. Esto genera muchas migraciones en nuestra base de datos, que es una base de datos Postgres 9.0. A menudo, estas migraciones también incluyen algún tipo de migración en los datos en sí. Ayer descubrimos que necesitábamos mover un atributo 'texto' en un modelo a un modelo separado para que el atributo ya no fuera solo un atributo en el modelo sino una relación de uno a muchos.enormes migraciones de datos en los carriles
Mi migración parecía algo como esto:
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
Ahora el problema es, que esto está funcionando muy lento, y aún peor, si me puse un contador, e imprime el progreso, puedo ver que la migración se está ejecutando más lento y más lento con el tiempo. En mi monitor de actividad puedo ver que el proceso de ruby está ocupando más y más memoria.
Así que mi pregunta es - ¿existe una mejor manera de hacer grandes migraciones de datos de este tipo?
Dale un golpe. Esto debería ahorrarle una tonelada de memoria. – erik
Gran respuesta. Nosotros también probamos eso, y parece que es un enfoque mucho mejor. Gracias por los pequeños consejos sobre sus propias experiencias :-) Encontré [este enlace] (http://railsapi.com/doc/rails-v3.0.8rc1/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#M004596) sosteniendo algunos información sobre métodos que ayuda a limpiar cosas solo un poco en nuestro código de rieles, al hacer declaraciones SQL manuales. –
@Niels Usar los métodos era lo que quise decir con "ejecutar desde la migración" :). Agregar el enlace allí hubiera sido mejor. – rubish