2

这与我之前的问题一起点击这里。我们正在使用 berkeley DB 进行临时存储,然后再将其处理并存储到关系 DB 中。当大小增加超过某个点时会出现问题。现在我们必须将文件拆分为较小的文件或压缩现有文件。在此问题我想问一下压缩部分,berkeley DB 是否有任何内置的压缩​​实用程序,或者我们是否必须以编程方式进行。如果它是内置的,那么它总是会更快。

4

1 回答 1

2

这里

根据伯克利常见问题解答,有两种优化方法(压缩前):

  1. 袖珍的
  2. 真空

您还可以实现自己的压缩算法,如此处所示

Berkeley DB VACUUM 与 SQLite 有何不同?

SQLite 将 VACUUM 命令实现为数据库转储,然后从该转储完全重新加载。这是一项昂贵的操作,在操作期间锁定整个数据库。这也是一个全有或全无的操作。要么有效,要么失败,您必须在某个时候再试一次。当 SQLite 完成时,由于从转储文件中按顺序插入数据,数据库的大小通常更小(文件大小更小),并且 btree 比以前组织得更好(更浅)。SQLite,当它工作时,当你负担得起将所有人锁定在数据库之外时,它在 VACUUM 方面做得很好。Berkeley DB 以完全不同的方式处理这个问题。对于现在的许多版本,Berkeley DB 的 B-Tree 实现已经能够在其他操作进行中时进行压缩。压缩是一个过程,其中检查 B-Tree 节点,当不是最佳时,它们被重新组织(反向拆分等)。B-Tree 越浅,在叶节点上查找数据所需的查找就越少。Berkeley DB 可以一次压缩树的部分或整棵树。对于 7x24x365(五个九)操作,这是至关重要的。BDB 版本的 compact 不会对正在进行的数据库操作产生不利影响,而 SQLite 的方法会。但是压缩不解决数据库的空白部分(数据库文件中删除的数据曾经存在的部分)。Berkeley DB 还支持压缩数据库文件,方法是在文件中移动数据,然后截断文件,将该空间返回到文件系统。从 Berkeley DB 的 5.1 版开始,VACUUM 命令将压缩和压缩数据库文件。此操作比 SQLite 的转储/加载方法花费更多时间,因为它正在做更多的工作以使数据库保持可操作性。我们相信这是正确的权衡,但如果您不同意,您可以随时在代码中转储/加载数据库。

于 2012-04-18T14:41:06.423 回答