我有一个需要生成图像并将数据发送到浏览器的Rails 3应用程序。
该应用必须部署在Heroku上。
但是,Heroku只支持通过Mongrel进行流式传输,而Mongrel会保留内存。这会导致Heroku变慢,然后在十几个请求后终止线程。
https://devcenter.heroku.com/articles/error-codes#r14-memory-quota-exceeded
我目前正在使用ActionController :: DataStreaming的send_data或send_file
http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_data
Heroku不支持Rack :: Sendfile或x-sendfile。
https://devcenter.heroku.com/articles/rack-sendfile
项目“ruby-mongrel-x-sendfile”说:“通过mongrel流式传输非常多的数据是一件坏事;弹出粗糙的内存泄漏”,并提供“in-mongrel解决方案”。但它看起来不是一个好的解决方案。
http://code.google.com/p/ruby-mongrel-x-sendfile/
对此的缓慢解决方案是首先将每个文件上传到Amazon S3。
有人有任何想法吗?
答案 0 :(得分:1)
答案是用以下方式开始垃圾收集:
GC.start
我在send_data之后将该行放在Rails控制器操作的底部。
答案 1 :(得分:0)
绝对不是开始垃圾收集的答案。这掩盖了执行不力的情况。严格来说,您的Ruby进程仍会消耗更多的内存。
答案是流式传输响应数据-即将数据逐块读取到内存中并通过响应主体进行刷新。这样,为发送的文件/数据提供服务的最大内存需求就被限制为要流式传输的“页面”的大小。
检出ActionController::Live
并将二进制数据分块读取到请求这些图像的客户端。