【发布时间】:2014-01-28 00:45:21
【问题描述】:
我在 cedar 堆栈上开发了一个 heroku rails 应用程序,这就是瓶颈。
def self.to_csvAlt(options = {})
CSV.generate(options) do |csv|
column_headers = ["user_id", "session_id", "survey_id"]
pages = PageEvent.order(:page).select(:page).map(&:page).uniq
page_attributes = ["a", "b", "c", "d", "e"]
pages.each do |p|
page_attributes.each do |pa|
column_headers << p + "_" + pa
end
end
csv << column_headers
session_ids = PageEvent.order(:session_id).select(:session_id).map(&:session_id).uniq
session_ids.each do |si|
session_user = PageEvent.find(:first, :conditions => ["session_id = ? AND page != ?", si, 'none']);
if session_user.nil?
row = [si, nil, nil, nil]
else
row = [session_user.username, si, session_user.survey_name]
end
pages.each do |p|
a = 0
b = 0
c = 0
d = 0
e = 0
allpages = PageEvent.where(:page => p, :session_id => si)
allpages.each do |ap|
a += ap.a
b += ap.b
c += ap.c
d += ap.d
e += ap.e
end
index = pages.index p
end_index = (index + 1)*5 + 2
if !p.nil?
row[end_index] = a
row[end_index-1] = b
row[end_index-2] = c
row[end_index-3] = d
row[end_index-4] = e
else
row[end_index] = nil
row[end_index-1] = nil
row[end_index-2] = nil
row[end_index-3] = nil
row[end_index-4] = nil
end
end
csv << row
end
end
end
如您所见,它会从一个表格中生成一个 csv 文件,该表格包含从一组调查中获取的每个单独页面上的数据。问题是表格中有大约 50,000 个单独的页面,heroku 应用程序继续给我 R14 错误(内存不足 512MB),并最终在 dyno 在一小时后进入睡眠状态时死亡。
话虽如此,我真的不在乎运行需要多长时间,我只需要它完成。我正在等待批准添加一个工人测功机来运行 csv 生成,我知道这会有所帮助,但与此同时我仍然想优化此代码。有可能一次处理超过 100,000 个页面,我意识到这是非常庞大的内存,并且确实需要尽可能减少其内存使用量。谢谢你的时间。
【问题讨论】:
标签: ruby-on-rails ruby optimization heroku