Stas Bekman <[EMAIL PROTECTED]> writes: > Joe Schaefer wrote: > > Stas Bekman <[EMAIL PROTECTED]> writes: > > [...] > > > >>Moving $b->remove to the end makes the code horribly kludgy. It's > >>better to change the idiom to step through the buckets instead of > >>removing them. Adjusting John's sample code: > >> > >> my $bb = $r->upload('file')->bb(); > >> open(OUT,">/tmp/test_file"); > >> for (my $b = $bb->first; $b; $b = $bb->next($b)) { > >> $b->read(my $data); > >> print OUT $data; > >> } > >> close OUT; > >>
[...] > > What I'm going to recommend in the Apache::Upload docs is ask people > > to use the TIEHANDLE api for io() instead: > > my $io = $req->upload("foo")->io; > > print while read $io, $_, 8000; # read() will manage the buckets for you > > Do you mean the difference is in being able to request chunks of > limited size (8k?). Otherwise the two are equivalent. No, they are not at all equivalent, because io *deletes* the buckets as it reads them, which puts them right back into the bucket allocator for immediate reuse. Witness: % CONTENT_TYPE="multipart/form-data; boundary=AaB03x" % PERL5OPT="-Mblib -MApache2 -MApache::Upload -MAPR::Bucket -MAPR::Pool" % export CONTENT_TYPE PERL5OPT % ls -sh ~/tmp/mfd_post_data 5.0M /home/joe/tmp/mfd_post_data % perl -wle '$r = Apache::Request->new(APR::Pool->new); \ $bb = $r->upload("pics")->bb; \ for ($b = $bb->first; $b; $b= $bb->next($b)) {$b->read($_)} \ system "ps u $$" ' < ~/tmp/mfd_post_data USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND joe 32201 0.0 0.4 38424 9952 ? S+ 05:34 0:00 perl -wle $r = Ap % perl -wle '$r = Apache::Request->new(APR::Pool->new); my $io = $r->upload("pics")->io; 1 while $io->read($_); system "ps u $$" ' < ~/tmp/mfd_post_data USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND joe 32203 0.0 0.2 33408 4908 ? S+ 05:36 0:00 perl -wle $r = Ap That's a difference of 5MB, or exactly one full copy of the upload file into RAM. This is because the for(...) loop transforms the sole file bucket into a string of heap buckets that aren't cleaned up until the pool goes away. [...] > In any case, I think $r->upload->slurp(my $data) is a goodness as it doesn't > require the user to even be aware of the internal representation. I was just teasing :-). Anyway's we can at least rip out the XS duplication in Apache::Upload and just write slurp in 2 lines of perl via bb->flatten. -- Joe Schaefer -- Report problems: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html