2

我有一个 Rails 3 应用程序需要生成图像并将数据发送到浏览器。

该应用程序必须部署在 Heroku 上。

然而,Heroku 只支持通过 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。

请问有人有什么想法吗?

4

2 回答 2

3

答案是开始垃圾收集:

GC.start

我在发送数据之后将该行放在 Rails 控制器操作的底部。

http://www.ruby-doc.org/core-1.9.3/GC.html

于 2012-08-30T02:03:32.943 回答
1

答案是绝对不要开始垃圾收集。这掩盖了糟糕的实施。您的 Ruby 进程仍然会消耗更多的内存——严格来说——这是必要的。

答案是流式传输响应数据——即将数据逐块读入内存并通过响应主体刷新。这样,为您发送的文件/数据提供服务的最大内存需求仅限于正在流式传输的“页面”的大小。

将二进制数据以块的形式检出ActionController::Live并读取给请求这些图像的客户端。

于 2020-10-03T20:37:07.103 回答