1

在 BerkleyDB JE 中使用游标时,我发现遍历数据集会产生大量随机读取 IO。这是因为 BDB 以主键升序遍历数据集。

在我的应用程序中,我对按顺序处理数据集没有任何要求(从数学上讲,我的操作是可交换的)并且我对最大化吞吐量感兴趣。

有没有办法以存储顺序而不是主键顺序处理带有光标的数据集。

4

2 回答 2

2

我猜不是;BDBJE 是一个日志结构的数据库——也就是说,所有的写入都附加到日志的末尾。这意味着记录总是附加到最后一个日志,并可能取代以前日志中的记录。由于 BDBJE 无法按设计写入旧日志,因此它无法将旧记录标记为已被取代,因此您无法向前遍历存储处理记录,因为您不知道该记录是否是最新的,而无需处理日志中稍后的记录。

BDBJE 将清理旧日志,因为它们的“实时”记录计数会减少,方法是将实时记录复制到新日志中并删除旧文件,这会进一步打乱排序。

我发现 Kyoto Cabinet 的 Java 绑定在原始插入性能方面比 BDB 更快,并且您可以选择存储格式,这可以让您优化游标排序的记录遍历性能。许可证类似(京都内阁是 GPL3,BDB 是 Oracle BDB 许可证(copyleft)),除非您在任何一种情况下都为商业许可证付费。

更新:从版本 5.0.34 开始,BDBJE 包括 DiskOrderedCursor 类,该类解决了所需的用例 - 它按日志顺序遍历记录,在未分段的日志文件中,该记录应与磁盘顺序相同。

于 2011-05-10T16:00:06.667 回答
0

有新的“批量访问”接口可用,允许使用与 flag 一致的 或 方法将多个可能连续的记录读​​取Db#get()缓冲区Dbc#get()中。DB_MULTIPLE

该文档适用于 4.2.52 版,我com.sleepycat.db在 Oracle 网站上查找该软件包的文档时遇到了一些麻烦。在这里,我找到了 4.8.30 版本的文档,但没有提到类Db和类。Dbc

啊,类MultipleEntryMultipleDataEntry看起来是有希望的等价物使用DB_MULTIPLE上面。这个想法是,当您使用(例如,MultipleDataEntry使用适当大小的缓冲区)获取数据时,您将一起取回一大堆记录,然后可以使用MultipleDataEntry#next().

我的印象是界面的这一部分一直在变化。由于我的项目中没有足够新版本的库可用,因此我还不能声称使用过这些批量获取接口。如果您能够调查它们的使用情况,请报告。

于 2011-05-10T20:10:18.983 回答