Heh. I'm actually working on this right now for the 1.00 release. The immediate fix is that you need to periodically run $db->optimize(), kinda like you used to have to vacuum in Postgres.

For those who care, the problem is in how the filespace is managed. In the 0.x series, there is no concept of freed space. There is just the end of the file. So, when you do $db->{myhash} = {} (or anything that triggers the CLEAR() subroutine), only the index is currently wiped clean. The actual space is still used. Nothing in the 0.x series will actually mark that space as being usable.

For 1.00, I'm working on a freespace management algorithm that will attempt to reuse as much freespace as possible. So, in this case, it will remain the same size because the area that is now freed will be marked as being usable.

It will still leak, but the leak will be any contiguous filespace that couldn't hold something anyways. That minimum is currently 9 bytes for an internal reference, which is something like:

$db->{foo} = {}; $db->{bar} = $db->{foo};
Without expensive relocations, there's no way to avoid this in any application that's based on a diskfile. Even applications like Oracle, MySQL, and Postgres eventually leak filespace. You just don't notice it.

My criteria for good software:
  1. Does it work?
  2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?

In reply to Re: DBM::Deep dbfile size by dragonchild
in thread DBM::Deep dbfile size by zentara

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.