使用Rails在公用文件夹中本地提供1GB文件

时间:2013-08-24 15:41:07

标签: ruby-on-rails ruby

我有一个名为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进行下载(再次)。

1 个答案:

答案 0 :(得分:5)

不要尝试直接通过Rails流式传输大型文件,尤其是使用WEBrick作为服务器。相反,将#send_file与Apache等Web服务器或支持X-Sendfile的Nginx一起使用。这使Web服务器可以直接流式传输文件,而不会在Rails进程中占用大量内存。