我需要构建和导出相当复杂的XLS表。为此,我正在关注RailsCast Exporting CSV and Excel教程。对于表的小样本,它工作得很好,但是当我尝试输出大约21 000个单元格的全表时,花了太长时间。 Heroku扔了:
应用程序错误应用程序和页面中发生错误 无法提供服务。请稍后再试。
如果您是应用程序所有者,请查看日志以获取详细信息。
但是在日志中看到花了超过4分钟,但最终完成了。:
2015-04-23T12:05:18.069312 + 00:00 heroku [router]:at = error code = H12 desc =“请求超时”
2015-04-23T12:09:14.876148 + 00:00 app [web.1]:呈现market_prices / index.xls.erb(266788.6ms)
2015-04-23T12:09:14.876474 + 00:00 app [web.1]:已完成200 OK 266805ms(浏览次数:62681.2ms | ActiveRecord:204120.4ms)
有没有办法加快进程或将任务以某种方式放在“后台”中,以便在完成创建时下载文件?
答案 0 :(得分:3)
似乎出现错误,因为任务耗时太长。
您应该包含后台工作人员,例如sidekiq,delayed job或Resque。
Rails 4.2添加了Active Job,这使得包括后台工作人员变得更加容易。
答案 1 :(得分:2)
这里有几件事:
没有任何代码,很难确定问题所在。这听起来像是一个可能的N + 1查询(你没有使用预加载也是热切的加载关联。热切的加载关联一次加载多个记录而不是一次请求一条记录。通常当你发出请求时,如果你看到你的开发日志中有一个文本墙,你有一个n + 1查询。子弹Gem有助于此。
以下是一个快速教程:
http://blog.arkency.com/2013/12/rails4-preloading/
如果您确实拥有预加载/预先加载的所有内容,请查看:
我会看看带有crispychicken响应的AXLSX Gem,它允许你在类上构建XLS / XLSX表,或者甚至把它作为自己的对象,而不是erb。我已经为需要excel的情况做了这个。要在完成后下载,用户必须手动执行此操作,或者您可以通过电子邮件将其发送给用户。我建议通过电子邮件将其发送给用户,使其远离您的公共文件夹,这是全世界都能看到的。
如果您不想发送电子邮件,可以使用send_file,它不会出现在您的公共文件夹中。它会要求用户下载它。我在tmp目录中创建一个报告文件夹来存储这些文件,直到它们被发送下载为止。