Tengo una herramienta de béisbol que permite a los usuarios analizar las estadísticas históricas de bateo de un jugador. Por ejemplo, ¿cuántos éxitos tiene A-Rod en los últimos 7 días durante las condiciones nocturnas? Quiero ampliar el cronograma para que un usuario pueda analizar las estadísticas de bateo de un jugador hasta 365 días. Sin embargo, hacerlo requiere una optimización del rendimiento seria. Aquí están mis conjunto actual de modelos:Actualización masiva de registros - optimización del rendimiento
class AtBat < ActiveRecord::Base
belongs_to :batter
belongs_to :pitcher
belongs_to :weather_condition
### DATA MODEL ###
# id
# batter_id
# pitcher_id
# weather_condition_id
# hit (boolean)
##################
end
class BattingStat < ActiveRecord::Base
belongs_to :batter
belongs_to :recordable, :polymorphic => true # e.g., Batter, Pitcher, WeatherCondition
### DATA MODEL ###
# id
# batter_id
# recordable_id
# recordable_type
# hits7
# outs7
# at_bats7
# batting_avg7
# ...
# hits365
# outs365
# at_bats365
# batting_avg365
##################
end
class Batter < ActiveRecord::Base
has_many :batting_stats, :as => :recordable, :dependent => :destroy
has_many :at_bats, :dependent => :destroy
end
class Pitcher < ActiveRecord::Base
has_many :batting_stats, :as => :recordable, :dependent => :destroy
has_many :at_bats, :dependent => :destroy
end
class WeatherCondition < ActiveRecord::Base
has_many :batting_stats, :as => :recordable, :dependent => :destroy
has_many :at_bats, :dependent => :destroy
end
En aras de mantener mi cuestión en un plazo razonable, que me narro lo que estoy haciendo para actualizar la tabla batting_stats en lugar de copiar un montón de código. Comencemos con 7 días.
- Recupera todos los registros de at_bat en los últimos 7 días.
- iterar sobre cada at_bat disco ...
- Dado un registro at_bat, agarra la masa asociada y WEATHER_CONDITION asociado, encontrar el registro correcto batting_stat (BattingStat.find_or_create_by_batter_and_recordable (bateador, WEATHER_CONDITION), a continuación, actualizar el registro batting_stat.
- Repetir . Paso 3 para bateador y el lanzador (Recordable)
Pasos 1-4 se repite para otros períodos de tiempo, así - 15 días, 30 días, etc.
Ahora imaginar cómo laborioso esto sería a ejecute un script todos los días para hacer estas actualizaciones si tuviera que expandir los períodos de tiempo de un mangeable 7/15/30 a 7/15/30/45/60/90/180/365.
Así que mi pregunta es ¿cómo te acercarías a conseguir que esto funcione al más alto nivel de rendimiento?
He creado un sistema similar para una aplicación de golf. Estoy dispuesto a compartir, pero requiere una explicación bastante extensa. ¿Estás dispuesto a modificar tu arquitectura o solo estás buscando una manera de optimizar la arquitectura que tienes actualmente? – mnelson
Sería muy apreciado escuchar cómo lo hiciste. Dispuesto a actualizar Arch, pero con problemas en el camino. – keruilin
¿Con cuántos registros está tratando? No puede haber tantos puntos de datos para el béisbol, seguramente (¿cientos de miles?). ¿No puedes simplemente guardar el lote en la memoria, posiblemente cortado por jugador en un mapa si es necesario y calcularlo todo sobre la marcha? –