Rob Das wrote at Thu, 03 Oct 2002 15:01:31 +0200:
> Hi all:
>
> I have a script that is merging many files into a new file, by reading one
> at a time and adding to the new one. The error I received was "Out of memory
> during request for 1016 bytes, total sbrk() is 1186891848 bytes!" (I did not
> add the "!"...). This is on a Sun box with 4 Gig, typically between 1 and 2
> Gig free. Is there anything I can do to reduce memory usage? None of my
> error messages were displayed, so I'm not even sure which statement caused
> the error (I check for errors on all but the "closedir" and
> "close(INFILE)"). I should mention that I'm processing 100,000 files of an
> average of about 6 K each. (Plan B is to reduce the number of files being
> processed.) Here is the code (stripped of the error checking):
>
> opendir(INDIR, $indir);
> @logfile=grep(/$mask/i, readdir INDIR);
> closedir(INDIR);
Here the whole INDIR is read at one time.
I assume that the file still is little enough,
so the problem must be somewhere else.
> $nbrfiles=@logfile; # number of files matching mask
> open(OUTFILE, ">$outdir$outfile");
> for ( $ctr=0; $ctr<$nbrfiles; $ctr++ ) {
> open(INFILE, "$indir$logfile[$ctr]");
> print OUTFILE <INFILE>;
That's only a shorthand version for
my @temp = (<INFILE>); # reads the whole file at once !!
print OUTFILE @temp;
> close(INFILE);
> }
> close(OUTFILE);
I would suggest a line by line copying instead:
foreach my lfile (@logfile) {
open INFILE, "$indir$lfile" or die "Can't open $lfile: $!";
while (<INFILE>) {
print OUTFILE;
}
close INFILE;
}
Greetings,
Janek
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]