On 10/22/2003 4:01 AM, Tim Bunce wrote: > On Tue, Oct 21, 2003 at 03:01:20PM -0700, Ovid wrote: >> Tim Bunce <[EMAIL PROTECTED]> wrote: >>> >>> I'd strongly recommend switching to Storable first. It did have problems >>> but it's now very robust and far, far, faster than Data::Dumper+eval. >>> This small change would yield a big gain. >> >> the data structure for the coverage [...] is so huge that I run out of >> memory (and this is on a machine with a couple of gigs of RAM). > > Reading and writing Data::Dumper format is much more memory hungry than > Storable. Switch to Storable will at least ease the problem. > > I don't have time in the short term to work on the (albeit fairly trivial) > change to Storable. If someone can do that and get a new release out then > I'll look deeper into the performance issues then.
I tried it, and it does help some. In my very unscientific test[1] it ran about 20% faster. The size of the db file (on disk) was about 75% smaller. I don't have numbers on RAM usage, but I didn't touch the internal representation so about all that's saved is the eval overhead. I've included a patch for Devel/Cover/DB.pm in case someone else wants to try it. It has *not* been sanctioned by Paul (though he's welcome to it) so use at your own risk. Obviously, the file format for the database is incompatible with the current version. [1] roughly 430 tests in 18 *.t files. Timing done with a wristwatch on a single-user WinXP system. -mjc *** DB.pm.old Thu Oct 23 14:58:02 2003 --- DB.pm.new Thu Oct 23 15:00:01 2003 *************** *** 18,25 **** use Carp; use Data::Dumper; use File::Path; ! my $DB = "cover.4"; # Version 4 of the database. sub new { --- 18,26 ---- use Carp; use Data::Dumper; use File::Path; + use Storable; ! my $DB = "cover.5"; # Version 5 of the database. sub new { *************** *** 49,65 **** $self->validate_db; $file = "$self->{db}/$DB"; return $self unless -e $file; ! open F, "<$file" or croak "Unable to open $file: $!"; ! $self->{filehandle} = *F{IO}; } - $self->read if defined $self->{filehandle}; - - if (defined $file) - { - close F or croak "Unable to close $file: $!"; - } - croak "No input db, filehandle or cover" unless defined $self->{cover}; $self --- 50,58 ---- $self->validate_db; $file = "$self->{db}/$DB"; return $self unless -e $file; ! $self->read($file); } croak "No input db, filehandle or cover" unless defined $self->{cover}; $self *************** *** 70,111 **** sub all_criteria { @{$_[0]->{all_criteria }} } sub all_criteria_short { @{$_[0]->{all_criteria_short}} } ! sub read ! { my $self = shift; ! local $/; ! my $db; ! my $fh = $self->{filehandle}; ! eval <$fh>; ! croak $@ if $@; $self->{cover} = $db->{cover}; $self->{collected} = $db->{collected}; $self->{indent} = $db->{indent}; ! $self } ! sub write ! { my $self = shift; $self->{db} = shift if @_; croak "No db specified" unless length $self->{db}; $self->validate_db; ! my $db = ! { cover => $self->{cover}, collected => $self->{collected}, indent => $self->{indent}, }; ! local $Data::Dumper::Indent = $self->indent; ! local $Data::Dumper::Sortkeys = 1; ! local $Data::Dumper::Useperl = 1; # TODO - remove this when possible ! my $file = "$self->{db}/$DB"; ! open OUT, ">$file" or croak "Cannot open $file\n"; ! print OUT Data::Dumper->Dump([$db], ["db"]); ! close OUT or croak "Cannot close $file\n"; ! $self } sub delete { my $self = shift; --- 63,96 ---- sub all_criteria { @{$_[0]->{all_criteria }} } sub all_criteria_short { @{$_[0]->{all_criteria_short}} } ! sub read { my $self = shift; ! my $file = shift; ! my $db = retrieve($file); ! $self->{cover} = $db->{cover}; $self->{collected} = $db->{collected}; $self->{indent} = $db->{indent}; ! return $self; } ! sub write { my $self = shift; $self->{db} = shift if @_; croak "No db specified" unless length $self->{db}; $self->validate_db; ! ! my $db = { cover => $self->{cover}, collected => $self->{collected}, indent => $self->{indent}, }; ! ! Storable::nstore $db, "$self->{db}/$DB"; ! return $self; } + sub delete { my $self = shift;