July 17, 2005
Db copying, merging, defragmenting, and linearizing
Sometimes it is percieved as desireable to linearize or 'defragment' an InfinityDB B-Tree database to increase speed or restore the almost perfect space utilization of a newly created db. (Note all db's use the UTF-8 and ZLib data compression at all times.) While this is not necessary in general, and has not been done in the past by most clients, it can be done with a trivial amount of code, as shown below. All internal free space - blocks on the free list - will be reclaimed, and the variable-length block storage format will allow extremely dense packing of data inside blocks. Linearizing the blocks should increase speed for sequential operations as well.
Note that there is almost no 'internal' free space, i.e. per-block overhead, because blocks are stored variable length; the average waste can be as low as a few percent. So, when we refer to free space, we always mean the 'external' free space; we mean the free space external to the block, which constitutes a set of empty blocks on a 'free list' inside the single db file. Free space is always used during any modification before the file is extended.
Significant amounts of free space necessarily occur when a large number of blocks are deleted or when there are a very large number of random updates before a commit. Sequential updates - those affecting Items close together - will only dirty one or a few blocks, so each batch can be considered equivalent to one random update operation. If commits are done reasonably often, free space can be kept well below ten percent, with 5% not uncommon. Committing after every few random updates will keep free space almost non-existent, at the expense of performance, of course, since a commit writes several blocks and forces them out with a FileDescriptor.sync(). The FileDescriptor.sync() is the slowest part, and is the only way any DBMS can be sure data has been written to disk, so that a transaction becomes durable. The commit overhead can be spread out over a resonable number of modifications. The worst-case utilization due to random updates is 50% if every page in the database is dirtied before a commit(). The utilization in this case will go back up to nearly 100% as usual as data is inserted in the future. Note that this free space should be looked at as a proportion of the original uncompressed data, so it may be effectively much smaller.
These characteristics can be understood by considering that all blocks currently containing data in the
db are left intact until the moment of commit, when the obsoleted blocks move atomically to the free list. Dirty blocks migrating out of the cache are kept in the free space until they become valid data atomically at commit().
Here is the simple code for copying an entire db:
void copyDb(String source, String dest) {
InfinityDB sourceDb = InfinityDB.open(source, false); // false=readonly
InfinityDB destDb = InfinityDB.create(dest, true); // true=overWrite
Cu cu = Cu.alloc(); // get a cursor from the free list of cursors
try {
while (sourceDb.next(cu)) { // get the next Item from sourceDb into the cursor
destDb.insert(cu); // put the Item into destDb
}
} catch (IOException e) {
e.printStackTrace();
}
cu.dispose(); // optional, for speed
sourceDb.close(); // release FD to be nice, free the cache
destDb.close(); // this also commits
}
This code will also merge sourceDb into destDb if destDb is not empty (use open(), not create()).
Because the InfinityDB B-Tree is fully Thread-safe and concurrent, it would also be easy to experiment with a multi-Thread version for use on SMP or RAID systems. The file might be partitioned by starting
Each Thread's Cu at a different place, for example. Tell us if you do this - we'll report the results here.
Posted 5 years, 7 months ago on July 17, 2005
The trackback url for this post is http://boilerbay.com/infinitydb/forum/bblog/trackback.php/7/
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comment pending moderation
Comments have now been turned off for this post