我有一个名为large.zip(大约1GB)的大文件存储在公用文件夹中。每当我尝试从localhost(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作为webserver。我认为分配的内存大小有限(400MB?)。那么有没有办法增加这个限制?或者如何解决这个问题?
编辑:我只是使用rails new创建一个rails应用程序然后将large.zip文件复制到公共文件夹中。然后我在Chrome上打开链接localhost:3000 / large.zip进行下载(再次)。
答案 0 :(得分:5)
不要尝试直接通过Rails流式传输大型文件,尤其是使用WEBrick作为服务器。相反,将#send_file与Apache等Web服务器或支持X-Sendfile的Nginx一起使用。这使Web服务器可以直接流式传输文件,而不会在Rails进程中占用大量内存。