Re: BerkeleyDB Queue Database Array Size
- From: "Paul Marquess" <Paul.Marquess@xxxxxxxxxxxxxx>
- Date: Mon, 14 Aug 2006 10:00:05 +0100
From: kallestad@xxxxxxxxx [mailto:kallestad@xxxxxxxxx]
I've been playing around with BerkeleyDB Queue database type, and I'veshift:
found something curious.
I'm tying an array variable to the queue database:
$db = tie @samplearray, 'BerkeleyDB::Queue',
-Flags => DB_CREATE,
-Filename => $config->get('db_queue_filename'),
-Env => $env,
-Len => 300
or print "$BerkeleyDB::Error\n" ;
I'm adding records to the database by pushing values into the array:
push @samplearray, $u or die "can't push $u $!\n";
And I'm pulling records from the beginning of the database using
shift @samplearray;shrink
Everything is working brilliantly - although I haven't tried
multiprocess access to the database which is a desired future step.
The curiosity that I have found is this:
$k = $#samplearray;
print "$k \n";
When the array is not "tied" to the BerkeleyDB, this number will
every time I shift a record out of the array - If I pull out 5 of 5
items, it would report 3,2,1,0,-1. However, when it is tied to the
database, it will always report the maximum queue size until there is
nothing left in the queue, at which point it will return -1 like it
normally would if it was just an array. In the above example - it's
4,4,4,4,-1
I tried calling $db->sync after pulling items out, but the issue still
exists. Being a bit of a newbie, I don't know if this is a problem
with the way I am implementing things, my technical understanding, or
if this is an actual bug. Any guidance is appreciated.
This is a limitation in the current perl interface to Berkeley DB.
The problem with providing an interface to return the number of records
in the queue (or any of the other database types that Berkeley DB
provides) is that the underlying Berkeley DB library has to traverse the
complete database to get an accurate count. If you have a large queue,
this is not desirable.
Have a look at this page. In particular, look at the DB_FAST_STAT entry.
http://www.sleepycat.com/docs/api_c/db_stat.html
If the limitations of DB_FAST_STAT are good enough for your purposes,
you can use it like this
$count = $db->db_stat("qs_nrecs", DB_FAST_STAT);
If you want to take the hit of traversing the database to count the
number of records, this should do the trick
$count = $db->db_stat("qs_nrecs");
Paul
- References:
- BerkeleyDB Queue Database Array Size
- From: kallestad
- BerkeleyDB Queue Database Array Size
- Prev by Date: Re: Net::SFTP / Net::SSH::W32Perl strange debug messages?
- Next by Date: Re: Net::SFTP / Net::SSH::W32Perl strange debug messages?
- Previous by thread: BerkeleyDB Queue Database Array Size
- Next by thread: Re: BerkeleyDB Queue Database Array Size
- Index(es):
Relevant Pages
|