我在想怎么问这个问题,所以如果需要的话,我会在问题解决的时候更新它。
我有一个虚拟证券交易所游戏网站,我一直在建设的乐趣人们做了大量的交易,每一笔交易都有自己的记录。
在显示投资组合页面时,我必须实时计算数据表上的所有数据,即用户拥有多少股份、总收益、损失等。
当我试图按公司逐日进行交易时,事情真的开始放缓了。
我真的没有任何代码来演示这一点-但它只是感觉我没有正确地处理这一点。
更新:这段代码特别慢

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

最佳答案

问题
当然慢了您可能正在从每个表中查找大量数据,并在循环的每个迭代中对多个表执行多个查找。
一个解决方案(在众多解决方案中)
您需要规范化数据,创建一些新模型来存储昂贵的计算值,并将更多的计算推送到数据库或表中。
在大容量数据上执行嵌套循环是一个危险的标志。您正在对数据库进行多次调用,理想情况下,您应该尽可能少地进行连续请求。
我不知道您需要如何规范化数据或优化查询,但您可以从查看explain的输出开始不过,一般来说,您可能希望消除任何完整的表扫描,并以较大的块返回数据,而不是一次返回一条记录。
这看起来更像是一个建模或查询问题,而不是Rails问题。希望这能让你找到正确的方向!

10-04 21:40
查看更多