对于要存储 15.000.000 个整数键的 Berkeley DB,应使用哪种访问方法?

Posted

技术标签:

【中文标题】对于要存储 15.000.000 个整数键的 Berkeley DB,应使用哪种访问方法?【英文标题】:Which access method shall be used for a Berkeley DB that it is going to store 15.000.000 of integer keys? 【发布时间】:2019-10-24 21:35:39 【问题描述】:

我计划为一个项目评估 BerkeleyDB,我必须存储 15.000.000 个键/值对。

键是 10 位的整数。 值是可变长度的二进制数据。

在 BerkeleyDB 文档 (https://web.stanford.edu/class/cs276a/projects/docs/berkeleydb/ref/am_conf/intro.html) 中说可以配置四种访问方法:

    Btree 哈希 队列 记录

虽然文档描述了每种访问方法,但我无法完全理解哪种访问方法更适合我需要存储的这个特定数据集。

这种数据应该使用哪种访问方式?

【问题讨论】:

【参考方案1】:

如果不确定,请选择 btree。这是最灵活的访问方法。当然,如果您确定您的应用程序适合其他应用程序之一,那就去吧。

注意事项:使用 BDB 编写一个真正有效的、事务性的、可恢复的并提供一致性保证的应用程序将非常耗时并且在每一步都容易出错。而且,如果您将其用于商业目的,则许可可能会彻底破坏交易。对于某些事情,它确实是最好的选择。在开始 BDB 探索之前,请确保您权衡所有其他关键价值存储选项:https://en.wikipedia.org/wiki/Key-value_database

【讨论】:

感谢您的注意。根据您的经验,这将是与 Java 一起使用的简单替代方案。如前所述,我的数据模型非常简单,整数(它们实际上是时间戳)作为键,可变长度的二进制有效负载(50-100 字节)作为值。没有并发,只有一个线程写入值,另外几个线程读取。也没有太多的写作活动。 整个数据集大约是几千兆字节?我会以任何有意义的 Java 数据结构将其全部保存在内存中。记录对文件系统中文件的写入。也许只是将它们附加到平面文件中?在启动时,读取整个内容并按顺序应用记录的写入。 对于更传统的数据库,请查看 LMDB。它具有 Java 绑定。应该比 Berkeley DB 更容易上手! 感谢您的澄清。在阅读本书第 11 章的 Java API 示例后,我也意识到了这一点。访问方法一章有点误导,因为明确表示允许可变长度有效负载的唯一方法是recno。我最初会尝试 Berkeley DB,因为它的 Java API(我正在使用 Java 进行原型设计)。拥有这本书也有助于完成工作。 我试过 Berkeley DB 和京都内阁。 Berkeley DB 很棒,但我发现操作它很复杂(它会产生互斥错误和你不知道如何处理的东西)。正如您所指出的,许可证也是有问题的,因为不清楚(因此有风险)是否必须解放源代码。 Kyoto Cabinet 超级简单(API 极其简单),但不处理并发。我要 LMDB,比京都更糟糕的 API。

以上是关于对于要存储 15.000.000 个整数键的 Berkeley DB,应使用哪种访问方法?的主要内容,如果未能解决你的问题,请参考以下文章

减小 Keras LSTM 模型的大小

MySQL出现警告:Integer display width is deprecated and will be removed in a future release

程序存储问题

带有向量作为键的 STL 映射

如何在多图中按排序顺序打印键的值

Redis实现之字典跳跃表整数集合