2011-03-02 26 views
1

我决定使用Berkeley DB的压缩功能,以优化尺寸,我的数据库高速缓存的命中率有些记录被修改后(收缩),留下“洞“在数据库中。的Berkeley DB:DB->紧凑型()总是失败的基于散列的数据库

但是,它不起作用。甚至没有用这个代码很简单缩小片:

if (db->open(db, NULL, dbFile, NULL, DB_HASH, DB_CREATE | DB_TRUNCATE, 0)) { 
    // Error... 
} 

if (res = db->compact(db, NULL, NULL, NULL, NULL, DB_FREE_SPACE, NULL)) { 
    db->err(db, res, "Compacting failed"); 
} 

我试图specifing第五个参数或离开了该标志,但仍无法与EINVAL(代码22)每次:

压实失败:无效的参数

(太糟糕了,没有一个更加精密的错误信息;最Berkeley DB的错误让他们)

它的工作原理我f我用DB_BTREE替换DB_HASH,这就是为什么我相信它与使用散列数据库格式有关。但是,根据documentation,压缩哈希表应该工作得很好。

有没有人有一个想法是什么可能会导致这样的错误?

PS:我使用的Berkeley DB 4.5.20。

+0

所以 - 这不成? “紧凑”呼叫或“开放”呼叫?你的文字说了一件事,但你的代码中的评论说另一个... – 2011-03-02 15:03:30

回答

2

我通过对Berkeley DB的最后几个版本的更改日志搜索。 change log for release 5.0指出“增加了对DB->紧凑接口的哈希数据库支持。[#16936]”。尽管当前版本的online documentation表示DB-> compact适用于Btree,Recno和Hash数据库,但在5.0版本中添加了对Hash的支持。

你也可以张贴到Berkeley DB Forum你的问题。

+0

非常感谢! – ChrisM 2011-03-04 10:26:33