Rajeev Prasad <rp.ne...@yahoo.com> wrote: >i have a lot of data coming/pouring in from this: > >my ($rout, $pid) = $ssh->pipe_out($cmd); >while (my $line = <$rout>) { > print filehandle $line; >} > >I want to stop writing after certain size is written (say 1gb). > >so i can try this: (it is working). But I am worried I am doing too >many stat (and i am imagining it would be very expensive operation). >there are about 500,000 lines coming in for 500mb data file, so below >is doing stat 500 thousand times!!! > > >my ($rout, $pid) = $ssh->pipe_out($cmd); >while (my $line = <$rout>) { > > my >($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)= >stat(filehandle); > if ($size < $huge_limit ){ > print $tmp_fh $line; > } else { > seek($tmp_fh, 0, 0); > print $tmp_fh "file size limit reached\n"; > kill TERM => $pid; > last; > } >} ###end while > > >so i am 'thinking' to try this: storing output in local temp array and >checking when it reaches 10mb ($huge_limit) then save it to file and >increase counter, when it happens total of $huge_limit_counter times >(50 for 500mb limit). I close the channel and proceed. Here I am >thinking, checking size of array 500,000 times (a 500k line array) is >somehow 'more efficient' then checking file-size using stat. > > > my $counter=1;my @tmp_arr; > my ($rout, $pid) = $ssh->pipe_out($cmd); > while (my $line = <$rout>) { > push(@tmp_arr,$line); > if (size(\@tmp_arr) > $huge_limit){ > $counter++; > if ($counter >= $huge_limit_counter){ > kill TERM => $pid; > last; > } else { > print $tmp_fh @tmp_arr; > undef(@tmp_arr); > } > } > } > if(tell($rout) != -1){close $rout;} > > >Please advice any suggestion for increasing efficiency of this code. > >thank you. >Rajeev
You should use the `tell` operator on the output file handle to discover how much data has been printed. HTH, Rob -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/