1

私はこれをどのように尋ねるかを理解しようとしているので、必要に応じて問題を解決するために質問を更新します。

私は楽しみのために構築している仮想証券取引所ゲームサイトを持っています。人々はたくさんの取引をします、そして、それぞれの取引はテーブルのそれ自身の記録です。

ポートフォリオページを表示するときは、データのテーブルですべてをその場で計算する必要があります。つまり、ユーザーが持っているシェアの数、合計の利益、損失などです。

私が日ごとに会社ごとの取引でそれをセグメント化しようとすると、物事は本当に減速し始めました。

これを示すために表示するコードは実際にはありませんが、これに正しくアプローチしていないように感じます。

更新:このコードは特に非常に遅いです

 #Returning an array of values for a total portfolio over time
  def portfolio_value_over_time
    portfolio_value_array = []

    days = self.from_the_first_funding_date

    companies = self.list_of_companies

    days.each_with_index do |day, index|

      #Starting value
      days_value = 0

      companies.each do |company|
        holdings = self.holdings_by_day_and_company(day, company)
        price = Company.find_by_id(company).day_price(day)
        days_value = days_value + (holdings * price).to_i
      end

      #Adding all companies together for that day
      portfolio_value_array[index] = days_value 
    end

ページの読み込み時間は最大20秒以上になる可能性があります-まったく正気ではありません。そして、私は多くのリクエストをMemcacheにキャッシュしました。

このようなライブデータに関するレポート/チャートを生成するべきではありませんか?cronタスクを実行してどこかに保存する必要がありますか?Railsでこの量のデータを処理するためのベストプラクティスは何ですか?

4

3 に答える 3

2

問題

もちろん遅いです。おそらく、各テーブルから大量のデータを検索し、ループの反復ごとに複数のテーブルで複数の検索を実行しています。

1つの解決策(多くの中で)

データを正規化し、高価な計算値を格納するためにいくつかの新しいモデルを作成し、より多くの計算をデータベースまたはテーブルにプッシュする必要があります。

大量のデータに対してネストされたループを実行しているという事実は、危険信号です。データベースに対して多くの呼び出しを行っていますが、理想的には、順次要求をできるだけ少なくする必要があります。

データを正規化する方法やクエリを最適化する方法がわかりませんが、 explainの出力を確認することから始めることができます。ただし、一般的には、全表スキャンを排除し、一度に1つのレコードではなく、より大きなチャンクでデータを返すことをお勧めします。

これは、実際には、Railsの問題というよりも、モデリングやクエリの問題のように見えます。これがあなたを正しい方向に向けさせてくれることを願っています!

于 2012-06-25T03:22:14.280 に答える
1

このすべてのデータを事前に計算して別のテーブルに保存する必要があります。テーブルの例は次のようになります。

Table: PortfolioValues
Column: user_id
Column: day
Column: company_id
Column: value
Index: user_id

次に、1つのクエリですべてのユーザーのポートフォリオデータを簡単に読み込むことができます。次に例を示します。

current_user.portfolio_values
于 2012-06-25T03:26:14.030 に答える
0

とにかくmemcachedを使用しているので、それらのクエリの一部をキャッシュするために使用します。例えば:

Company.find_by_id(company).day_price(day)
于 2012-06-25T03:42:56.343 に答える