2

public フォルダーに large.zip (約 1GB) という名前の大きなファイルが保存されています。ローカルホスト (localhost:3000/large.zip) からダウンロードしようとすると、次のエラー メッセージが表示されます。

[2013-08-24 22:22:28] ERROR NoMemoryError: failed to allocate memory
        E:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/handler/w
ebrick.rb:72:in `block in service'
        E:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/file.rb:1
25:in `block in each'
        E:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/file.rb:1
17:in `open'
        E:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/file.rb:1
17:in `each'
        E:/RubyStack/ruby/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/handler/w
ebrick.rb:71:in `service'
        E:/RubyStack/ruby/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
        E:/RubyStack/ruby/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
        E:/RubyStack/ruby/lib/ruby/1.9.1/webrick/server.rb:191:in `block in star
t_thread'

ダウンロードは 43619924 バイト (約 400MB) で停止します。私の PC は 8GB RAM で、Ruby 1.9.3、Rails 3.2.14、Webbrick を Web サーバーとして使用しています。割り当てられるメモリのサイズにはいくつかの制限があると思います (400MB ?)。この制限を増やす方法はありますか?または、この問題を解決する方法は?

編集: rails new を使用して rails アプリケーションを作成し、large.zip ファイルを public フォルダーにコピーします。次に、Chrome でリンク localhost:3000/large.zip を開いてダウンロードします (再度)。

4

1 に答える 1

5

特に WEBrick をサーバーとして使用している場合は、Rails 経由で大きなファイルを直接ストリーミングしようとしないでください。代わりに、X-Sendfile をサポートするApache やNginxなどの Web サーバーで#send_fileを使用します。これにより、Rails プロセスで大量のメモリを消費することなく、Web サーバーがファイルを直接ストリーミングできるようになります。

于 2013-08-24T17:31:00.410 に答える