2011-11-16 14 views
6

私はユーザーがプレーヤーの歴史的打撃の統計を分析できるようにする野球ツールを持っています。たとえば、A-Rodは夜間の状態で過去7日間にヒットした回数はいくつですか?私は時間枠を広げて、ユーザーがプレーヤーの打撃の統計を365日後まで分析できるようにしたい。ただし、これを行うには、重大なパフォーマンスの最適化が必要です。膨大な数のレコードを更新する - パフォーマンスの最適化

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 

私はbatting_statsテーブルを更新することはなく、コードの束をコピーしています何を物語るせ、合理的な長さで私の質問を保つのために:ここではモデルの私の現在のセットがあります。 7日から始めましょう。

  1. 過去7日間のすべてのat_batレコードを取得します。記録at_bat各オーバー
  2. 反復... at_batレコードを考える
  3. は、関連する打者と関連するweather_conditionをつかむ正しいbatting_statレコード(BattingStat.find_or_create_by_batter_and_recordable(打者、weather_condition)を見つけ、その後、batting_statレコードを更新。
  4. 繰り返しを打者と投手のためのステップ3(recordables)

1-4は、他の時間帯のために繰り返される - 。15日、30日など

今私は、これは可能だろうか、面倒な想像に毎日スクリプトを実行して、管理期間を7/15/30から7/15/30/45/60/90/180/365に変更する場合は、これらの更新を行います。

私の質問は、これを最高レベルのパフォーマンスで実行するにはどうすればよいですか?

+0

私はゴルフアプリのために同様のシステムを構築しました。私は共有したいと思っていますが、かなり広範な説明が必要です。あなたはあなたのアーキテクチャを変えようとしていますか、現在持っているアーキテクチャを最適化する方法を探していますか? – mnelson

+0

どうしたのか聞いていただければ幸いです。アーチを更新したいと思っているが、道のりを突き抜ける。 – keruilin

+0

あなたはいくつのレコードを扱っていますか?野球のための多くのデータポイントは、確かに(数十万?)存在することはできません。必要に応じて、プレイヤーがマップにスライスして、その場ですべて計算して、記憶に残しておくことはできませんか? –

答えて

3

ARは、このようなバルク処理を実際には意味しません。あなたはたぶん、バッチ更新をSQLに落として、INSERT FROM SELECT(またはおそらくあなたのためにこれを行った宝石を使用して)を実行するほうが良いでしょう。

1

最終的な日を終わりに置き換えて、合計を再計算する必要のない新しい初日に置き換える必要があります。

これを行う1つの方法は、加算の前の値を保存し、それから最後の日の値を減算し、新しい曜日の値を加算し、15/30/90/365で割ります。

これは、366回の操作を3回に変えます。今や、363回の操作よりも遅いデータベースからの読み取りですか?

これにより、繰り返しの作業が節約されるため、更新が必要な気象条件を毎日確認するだけで済みます。

0

米国のレンタル60万レコードのバッチ読み込みで同様の問題があります毎週のデータ。各レコードを連続して処理するには24時間以上かかります。しかし、必ずしもボトルネックとなっていたデータベースではありませんでした。挿入には一定の時間がかかりましたが、データベースはアクティビティによって最大化/固定/平滑化されませんでした。

私はファイルを個々の文字列レコードに分割するのが簡単で速いことを知っていました。私たちの場合、入力ファイルはXMLの形式であり、単純なJavaのStringTokenizerを使用してファイルを...タグに分割しました。

これは、すばやく、解析してインポートする必要があるレンタルプロパティ情報を含むXMLスニペットの大きな配列を私に与えました。

次に、Java ThreadPoolExecutor/FutureTask/Callableの規約を使用して、各XMLスニペットを入力として取得し、関連するデータを抽出し、データベースの挿入を実行する20個のスレッドのプールを作成しました。私はあなたのアーキテクチャが同等であるかどうかわかりませんが、似たようなものがあると思います。

最後に、さまざまなテスト条件でデータベースサーバーの負荷を監視して、レコードスループットを最大限にするためにスレッドプールのサイズを調整できました。私たちはスレッドプールサイズ25で解決しました。

0

私がこの種の仕事をしていた時、私はSQLリファレンスを壊して、複雑なアップデートをどうやって自分の心をリフレッシュしましたか?通常は、短いクエリで多くの更新を行うことができます。また、クエリの直接の支援を見つけることができるはずです(スキーマを投稿し、実際に巨大であれば要点を開始してください)

私は最近counter_cache値をシードしなければならず、 Rubyコード両親をロードし、子供たちを数え、私はこのクエリに打撃与えた:あなたは1つのクエリでそれを行う、とあればできない場合は、わずか数秒

で20万行を更新

UPDATE rates r SET children_count = child_counts.my_count from (SELECT parent_id, count(*) as my_count FROM rates GROUP BY parent_id having parent_id is not null) as child_counts where child_counts.parent_id = r.id; 

をその1回の操作では、プロセスを2つのステップに分けることができます。最初に重い持ち上げを行い、結果を新しいテーブルに格納し、そのテーブルから読み込んで最終更新を行います。私は最近、大規模なデータ集約を行う必要があり、すべての重労働には2日間の処理と計算が必要でした。結果は、関連する行IDと最終合計を持つ新しいテーブルに入れられました。プロダクションでは、新しいテーブルから読み込んで関連する行を更新するクイックスクリプトを作成しました。これにより、私が中断したところから停止して再起動することができ、更新前に結果を事前にチェックすることができました。また、それは本当に速いprod更新プログラムを作った。

これを実行している間は、できるだけ頻繁にトランザクションをコミットすることができれば、バッチで作業を行うことが重要であることも知ったので、長時間にわたって大量のトランザクション。

関連する問題