2

画像を生成してデータをブラウザーに送信する必要がある Rails 3 アプリがあります。

アプリは Heroku にデプロイする必要があります。

ただし、Heroku は、メモリを保持する Mongrel を介したストリーミングのみをサポートしています。これにより、Heroku が遅くなり、12 ほどのリクエストの後にスレッドが強制終了されます。

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" は次のように述べています。しかし、それは良い解決策のようには見えません。

http://code.google.com/p/ruby-mongrel-x-sendfile/

これに対する遅い解決策は、最初にすべてのファイルを Amazon S3 にアップロードすることです。

アイデアはありますか?

4

2 に答える 2

3

答えは、次のようにガベージ コレクションを開始することです。

GC.start

その行を、send_data の後の 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 に答える