Hi Fred-

What you're saying makes a lot of sense.  As your automatic-flushing-
the-rails-3-1-plan article relates, for most rails interactions it's
difficult to stream because of all the evaluation that needs to
occur.  Larger file downloads really are a special case.  Using rails
metal to respond seems logical.

When I get a moment I'll create a brand new rails app and see if I can
get rails to stream as I'd expect; perhaps there is something in rack
that is preventing the streaming.

In rails 3, the render :text => lambda { ... } is definitely broken.

Thanks for the help!

--> Eric

On Oct 11, 2:19 pm, Frederick Cheung <frederick.che...@gmail.com>
wrote:
> On Oct 11, 7:44 pm, ehansen486 <ehansen...@gmail.com> wrote:
>
> > Nothing honestly moved the performance needle in a serious way.
>
> > I've finally come to the conclusion that rails does not stream out as
> > I'd expect.  Here's a look at the perf stats rendered as the request
> > runs:
>
> it doesn't. Rails 3.1 will change some of that apparently (http://
> yehudakatz.com/2010/09/07/automatic-flushing-the-rails-3-1-plan/)
>
> If you drop down to the rack level  (ie write this as a rails metal)
> you should be able to stream responses - the rack body response can be
> any thing that responds to each. and rack will keep calling that each
> method until you're done.
>
> .The docs also say that render :text => lambda { ...} allows streaming
> but with various conflicting opinions form actual users (I've never
> tried that). This may also depend on the server (mongrel, thin etc)
> you use - it's no good you streaming data to rack if the next person
> down the chain sits on it until is done
>
> Fred
>
>
>
>
>
> > Rendered hgrants/_request_detail (2.2ms)
> > Rendered hgrants/_request_detail (3.9ms)
> > Rendered hgrants/_request_detail (2.4ms)
> > Rendered hgrants/_request_detail (2.3ms)
> > Rendered hgrants/_request_detail (242.7ms)
> > Rendered hgrants/_request_detail (2.2ms)
> > Rendered hgrants/_request_detail (1.9ms)
> > Rendered hgrants/_request_detail (1.8ms)
>
> > We went from an average 2ms up to 242ms then back down.  I saw this
> > sporadically throughout the 1000 template renderings  That suggests to
> > me that memory is getting garbage collected.  Also, I'm invoking the
> > request from curl, and it reports no data downloaded until after my
> > logfile tells me rails has finished processing all records in the
> > view.  The model IDs that result in the over-sized ms count vary from
> > one request to another, so I'm convinced there is nothing in the app
> > that is doing this.  I even tested this by removing the call to the
> > HAML template and replacing it with a block of generated text and
> > observed similar behavior.
>
> > This is how I'm invoking HAML from the XML Builder template:
> >         xml << render(:partial => 'hgrants/
> > request_detail.html.haml', :locals => { :model => model })
>
> > I also tried using this trick to try to get it to stream, but I
> > observed exactly the same behavior; no data showed up in curl until
> > all records had been processed.
> >      render :text => (lambda do |response, output|
> >          extend ApplicationHelper
>
> >          xml = Builder::XmlMarkup.new(
> >            :target => StreamingOutputWrapper.new(output),
> >            :indent => 2)
> >         eval(default_template.source, binding, default_template.path)
> >      end)
>
> > (Also, in rails 3, the render :text with a Proc, rails 3 renders the
> > Proc as a to_str rather than calling it.)
>
> > This particular issue I can certainly work around but it's
> > disappointing if it's true that there's no way in rails to stream
> > output to the browser for large pages.  And particularly disappointing
> > if PHP/Symfony can outgun rails for streaming.  I've been using rails
> > since 2006 and most requests have fairly small responses so maybe the
> > answer is to defer to a different technology for streaming larger
> > files.  But it seems like there should be a good solution for
> > streaming data and flushing the output stream.
>
> > Any help is greatly appreciated!
> > Eric

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-t...@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to