我正在试图弄清楚如何问这个 - 所以我会更新问题,因为它可以在必要时清理它。
我有一个虚拟的股票交易所游戏网站,我一直在建设中寻求乐趣。人们进行大量交易,每笔交易都是自己在一张桌子上的记录。
在显示投资组合页面时,我必须在数据表上即时计算所有内容 - 即用户拥有多少股票,总收益,损失等。
当我尝试按公司的交易细分时,事情真的开始放缓。
我真的没有任何代码可以证明这一点 - 但只是觉得我没有正确接近这个。
更新:此代码特别慢
#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中处理这一数据量的最佳实践?
答案 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)