【问题标题】:Berkeley DB: DB->compact() always fails for hash-based databasesBerkeley DB:对于基于散列的数据库,DB->compact() 总是失败
【发布时间】:2011-03-02 14:57:44
【问题描述】:

在某些记录被更改(缩小)后,我决定使用 Berkeley 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");
}

我尝试指定第五个参数或省略标志,但每次都失败并显示 EINVAL(代码 22):

压缩失败:参数无效

(太糟糕了,没有更精确的错误消息;大多数 Berkeley DB 错误都有它们)

如果我将 DB_HASH 替换为 DB_BTREE,它会起作用,这就是为什么我认为它与使用 hash db 格式有关。但是,根据documentation,压缩哈希表应该可以正常工作。

有人知道可能导致此错误的原因吗?

PS:我使用的是 Berkeley DB 4.5.20。

【问题讨论】:

  • 那么——哪个失败了? compact 电话或open 电话?您的文字说明了一件事,但代码中的注释说明了另一件事......

标签: c berkeley-db


【解决方案1】:

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

您可能还想将您的问题发布到Berkeley DB Forum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多