http://qs321.pair.com?node_id=1165264

Perl_Love has asked for the wisdom of the Perl Monks concerning the following question:

Hello everybody, when I use BerkelyDB, I find that I use the db_del function. But the DB file has not become small , maybe it just made a mark. Is there any method can make DB files smaller? what method ? By the way, when run after the production , there will be three file, __db.001, __db.002, __db.003, what is the action of three files ? thanks a lot!
#!/usr/bin/perl -w use warnings; use BerkeleyDB; $|=1; my $env=new BerkeleyDB::Env -Home=>'/home/y6cme/perl5', -Flags=>DB_CREATE|DB_INIT_MPOOL || die; my %hash; my $db=tie(%hash,"BerkeleyDB::Btree", -Filename=>"test.db", -Flags=>DB_CREATE, -Env=>$env) || die; for(1..10000){ $hash{$_}=$_; } untie $db; undef %hash; my $db2=tie(%hash2,"BerkeleyDB::Btree", -Filename=>"test.db", -Flags=>DB_CREATE, -Env=>$env) || die; for(1..10000){ $db2->db_del($_); } untie $db2; undef %hash2;

Replies are listed 'Best First'.
Re: db_del of BerkeleyDB
by Corion (Patriarch) on Jun 10, 2016 at 06:35 UTC

    The generic approach to make a database file smaller is to rewrite the file by copying all rows into a new file.

    Usually, databases don't release free space back to the file system but just mark it as "available for data" internally. It is often much faster to maintain this internal bookkeeping instead of rewriting the file each time a record in the middle of the file gets deleted.

Re: db_del of BerkeleyDB
by Anonymous Monk on Jun 10, 2016 at 03:27 UTC