On Thu, Nov 19, 2009 at 2:25 AM, John Buckman <j...@magnatune.com> wrote:
> I'm writing an app that accepts large file uploads, and trying to lower the 
> memory requirements.
>
> When I upload large files, at the point where the files are completely 
> uploaded, Naviserver consumes an equivalent amount of memory as the file 
> uploaded size, as it hands control over to my form handler. Memory is 
> released once my form handler returns.  Virtually no memory is used (thanks, 
> spooler) as the large file is being uploaded, only once the upload completes.
>
> I'm not sure why Naviserver needs to hold the file in memory.
>
> So, questions:
>
> a) is this by design?
> b) has anyone on this list worked on this section of code?
> c) any fixes, or should I plunge into the nsd/form.c code (is that right?) to 
> try to fix this?


We originally talked about this way back in 2005:

http://sourceforge.net/mailarchive/message.php?msg_id=37583D44-1F17-401D-8BCA-26F816831B92%40archiware.com

Spooling got implemented later.

What didn't didn't get implemented, and what you're tripping over, is
the on-the-fly parsing of file-upload mime headers so that *only* the
contents of the actual file becomes a file spooled on disk, and not
the file topped and tailed with mime headers.  As you've discovered,
the way the form parsing is implemented it just reads the whole thing
back into memory anyway, negating the benefit of spooling to disk.

Ideally, the spooler thread would parse the form as it is read in
chunks from the socket, placing variables in the form structure, and
spooling file contents to disk. If more than one file is in the form
then multiple spool files would be used.

Watch out for encoding. IIRC the way it currently works forms can be
reparsed if the encoding changes. Perhaps everything but the file
parts of a multipart form could be saved in a buffer..? ie. you strip
out the large files from the input stream and leave the rest for
normal form processing.

Also watch out for which temp directory files are being spooled to. If
it is on a separate partition then the final rename() will actually be
a file copy.  Large files should probably be sent to a configured
spool directory.

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel

Reply via email to