2013-08-24 15 views
2

我有一個名爲large.zip(大約1GB)的大文件存儲在公用文件夾中。每當我試圖從本地主機(本地主機:3000/large.zip)下載它,我收到以下錯誤消息在公用文件夾中使用Rails在本地服務1GB文件

[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)。我的電腦是8GB內存,我使用Ruby 1.9.3,rails 3.2.14和webbrick作爲web服務器。我認爲分配內存的大小有限制(400MB?)。那麼有沒有辦法增加這個限制?或者如何解決這個問題?

編輯:我只是創建一個使用rails新的rails應用程序然後我將large.zip文件複製到公用文件夾。然後我打開Chrome上的鏈接localhost:3000/large.zip來下載它(再次)。

+4

您能否顯示下載鏈接的控制器代碼?可能你應該使用'send_file'方法,它將使用Web服務器的文件流,而不是將內容加載到Ruby進程。 –

+0

我編輯了更多信息的問題。由於我以這種方式創建了應用程序,因此沒有用於下載鏈接的控制器代碼。 – v4r

回答

5

不要嘗試直接通過Rails流式傳輸大文件,尤其是WEBrick作爲服務器。相反,將#send_file用於支持X-Sendfile的Web服務器,如Apache或Nginx。這使Web服務器能夠直接流式傳輸文件,而無需在Rails進程中佔用大量內存。

相關問題