[Zope3-dev] Re: URGENT RFC: Is anyone using response.write in Zope 3?

Jim Fulton jim at zope.com
Sat Dec 31 13:29:27 EST 2005


Shane Hathaway wrote:
> Jim Fulton wrote:
> 
>> I could certainly find evidence that you tried, but the implementation 
>> was
>> actually buffering data in a string buffer until the request was 
>> finished.
>> This was the case at least as early as spring of 2004.
> 
> 
> Even with more than 1050000 bytes output over a slow connection?  That's 
> the default threshold; see 
> zope.server.adjustments.Adjustments.outbuf_overflow.  It certainly 
> worked at one time.  In any case, it appears to be unnecessary now.

Christian Theune and I looked at this in early 2004 and came to the conclusion
that data were being stored in memory. I think we used the debugger to determine this.
We weren't using a slow connection.  A casual scan of the code suggests the
data *should* be stored in a temporary file, which made me doubt my assertions. :)
I just verified though with the following view on X3.0:

class Big:

     def __init__(self, context, request):
         self.request = request

     def big(self):
         response = self.request.response
         response.setHeader('content-type', 'text/plain')
         response.setHeader('content-length', str(51*20*1000*100))
         for i in range(20*1000*100):
             response.write('x'*50+'\n')

That outputting lots of data causes memory to baloon.
In this case, on my machine, the virtual memory jumped
about 150 megs and the in-use memory jumped about 100 megs.

<shrug>

I then tried the following view with the trunk, whis is about the same
as 3.2:

import tempfile

class Big:

     def __init__(self, context, request):
         self.request = request

     def big(self):
         response = self.request.response
         response.setHeader('content-type', 'text/plain')
         f = tempfile.TemporaryFile()
         for i in range(20*1000*100):
             f.write('x'*50+'\n')
         return f

Here the memory temporarily jumped about 7 megs and the output
came back about an order of magnitude faster.

I tried this with both the Twisted and ZServer servers and
got about the same result (although I got an error in the log
for ZServer that I need to look into).

Jim


-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org


More information about the Zope3-dev mailing list