在 BerkleyDB JE 中使用游标时,我发现遍历数据集会生成大量随机读取 IO。这是因为 BDB 按主键升序遍历数据集。
在我的应用程序中,我没有任何要求按顺序处理数据集(从数学上讲,我的操作是可交换的),并且我对最大化吞吐量感兴趣。
有没有办法用光标按存储顺序而不是按主键顺序处理数据集。
最佳答案
我想不会; BDBJE 是一个日志结构的数据库——即所有写入都附加到日志的末尾。这意味着记录始终附加到最后一个日志,并且可能会取代先前日志中的记录。由于 BDBJE 在设计上无法写入旧日志,因此它无法将旧记录标记为已取代,因此您无法向前浏览存储处理记录,因为如果没有处理日志中稍后的记录,您不知道该记录是否是最新的。
当旧日志的“实时”记录数量减少时,BDBJE 将通过将实时记录复制到新日志中并删除旧文件来清理旧日志,这会进一步打乱排序。
我发现Kyoto Cabinet 的Java 绑定(bind)在原始插入性能方面比BDB 更快,并且您可以选择存储格式,这可以让您优化游标排序记录遍历性能。许可证类似(Kyoto Cabinet 是 GPL3,BDB 是 Oracle BDB 许可证(copyleft)),除非您在任何一种情况下都支付商业许可证费用。
更新:As of version 5.0.34 ,BDBJE 包含 DiskOrderedCursor 类,它解决了所需的用例 - 它按日志顺序遍历记录,在未碎片的日志文件中应与磁盘顺序相同。
关于java - 按存储顺序遍历 BerkleyDB 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5946827/