处理rails 3中的大量报表/财务数据,而不会减速?

时间:2012-06-25 03:00:35

标签: ruby-on-rails ruby ruby-on-rails-3

我正在试图弄清楚如何问这个 - 所以我会更新问题,因为它可以在必要时清理它。

我有一个虚拟的股票交易所游戏网站,我一直在建设中寻求乐趣。人们进行大量交易,每笔交易都是自己在一张桌子上的记录。

在显示投资组合页面时,我必须在数据表上即时计算所有内容 - 即用户拥有多少股票,总收益,损失等。

当我尝试按公司的交易细分时,事情真的开始放缓。

我真的没有任何代码可以证明这一点 - 但只是觉得我没有正确接近这个。

更新:此代码特别慢

 #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中处理这一数据量的最佳实践?

3 个答案:

答案 0 :(得分:2)

问题

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

一种解决方案(众多)

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

您正在对高容量数据执行嵌套循环这一事实是一个红旗。您正在对数据库进行多次调用,理想情况下,您应该尽可能少地执行顺序请求。

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

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

答案 1 :(得分:1)

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

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

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

current_user.portfolio_values

答案 2 :(得分:0)

由于您仍在使用memcached,因此请使用它来缓存其中一些查询。例如:

Company.find_by_id(company).day_price(day)