2

我有一个名为 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)处停止。我的电脑是 8GB RAM,我使用 ruby​​ 1.9.3、rails 3.2.14 和 webbrick 作为网络服务器。我认为分配内存的大小(400MB?)有一些限制。那么有没有办法增加这个限制呢?或者如何解决这个问题?

编辑:我只是使用 rails new 创建了一个 rails 应用程序,然后将 large.zip 文件复制到公用文件夹中。然后我在 Chrome 上打开链接 localhost:3000/large.zip 以下载它(再次)。

4

1 回答 1

5

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

于 2013-08-24T17:31:00.410 回答