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

问题

当然,它很慢。您可能正在从每个表中查找大量数据,并在循环的每次迭代中对多个表执行多次查找。

一种解决方案(众多)

您需要标准化您的数据,创建一些新模型来存储昂贵的计算值,并将更多的计算推送到数据库或表中。

您正在对大量数据进行嵌套循环这一事实是一个危险信号。您正在对数据库进行多次调用,而理想情况下,您应该尽可能少地发出顺序请求。

我不知道需要如何规范化数据或优化查询,但您可以从查看explain的输出开始。但是,一般来说,您可能希望消除任何全表扫描并以更大的块返回数据,而不是一次返回一条记录。

这看起来更像是一个建模或查询问题,而不是 Rails 问题。希望这能让你指出正确的方向!

于 2012-06-25T03:22:14.280 回答
1

您应该预先计算所有这些数据并将其存储在另一个表中。示例表可能如下所示:

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

然后,您可以通过单个查询轻松加载所有用户的投资组合数据,例如:

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 回答