use strict; use warnings; use constant CACHESIZE => 2**24; ## Default size of cache memory (2**24=>16_777_216) use constant PAGESIZE => 2048; our %RCache = (); keys( %RCache ) = 1020; $dbenv{DB_RMaxkeys} = CACHESIZE / PAGESIZE; . . . if ( scalar keys %RCache > $dbenv{DB_RMaxkeys} ) { &CheckMemoryUsage('WR'); } . . . if ( scalar keys %RCache > $dbenv{DB_RMaxkeys} ) { &CheckMemoryUsage('RN'); } . . . if ( scalar keys %RCache > $dbenv{DB_RMaxkeys} ) { &CheckMemoryUsage('RP'); } . . . # my $ret = &GetSubBuffer(\$db,$subtreeptr,\$buffer, $log ) sub GetSubBuffer { my ( $db, $ptr, $buffer, $log ) = @_; my $size = $dbenv{DB_InternalPageSize}; if ( ( $CACHE == 1 )&&( exists $RCache{$ptr} ) ) { $$buffer = $RCache{$ptr}; } else { if ( $ptr < $size ) { die " GetSubBuffer: $log subtreeptr $ptr <= 0\n"; } $ret = sysseek( $$db{btree}, $ptr, 0); # move to subtree location in file if ( ! defined $ret ) { die " GetSubBuffer: $log sysseek failed:|$ptr| $!\n"; } $ret = sysread( $$db{btree},my $tmpbuf, $size ); if ( $ret != $size ) { die " GetSubBuffer: $log sysread failed: $!\n"; } my $reclen = unpack("N", substr($tmpbuf,0,4)); if ( ! defined $$buffer ) { die "$log buffer not defined!"; } substr($$buffer,0,$reclen+4,$tmpbuf); #*# if ( $CACHE == 1 ) { $RCache{$ptr} = $$buffer; } } } sub CheckMemoryUsage { our %RCache; use Devel::Size qw(total_size); my $log = shift; my $stime = gettimeofday; my $keys = scalar keys %RCache; print $DLOG "MEM_CK-$log: Enter: Keys:$keys \%RCache Size: ",total_size(\%RCache),"\n"; my ( $vmem, $rmem ) = &Display_Mem_Usage($$,$NAME,0); my $rkeys = scalar keys %RCache;