我需要将超过 10 亿个 key 加载到 Berkley DB 中,因此我想提前对其进行调整以获得更好的性能。使用标准配置,我现在需要大约 15 分钟来加载 1'000'000 个键,这太慢了。 是否有适当的方法来调整例如 Berkley DB 的 B+Tree(节点大小等...)?
(作为对比,调优tokyo cabinet后,25分钟加载10亿个key)。
附: 我正在寻找将调优技巧作为代码而不是为正在运行的系统设置的参数(如 jvm 大小等...)
最佳答案
我很好奇,当 TokyoCabinet 在 25 分钟内加载 1B 键时,存储的键/值的大小是多少?您使用的 I/O 系统和存储系统是什么?您是否使用术语“负载”来表示对永久稳定存储的 1B 事务提交?那将是每秒约 666,666 次插入,考虑到我所知道的任何 I/O 系统,这在物理上是不可能的。将该数字乘以键和值的大小,现在您已经无可救药地超出了物理极限。
请查看Gustavo Duarte的博客,阅读一些有关 I/O 系统以及硬件如何工作的信息,然后查看您的陈述。我非常有兴趣找出 TokyoCabinet 到底在做什么和没有做什么。如果我不得不猜测,我会说它要么提交到操作系统中的文件系统缓存,但没有将这些缓冲区刷新(fdsync()-ing)到磁盘。
完全披露:我是 Oracle Berkeley DB(TokyoCabinet 的直接竞争对手)的 Oracle 产品经理,我已经使用这些数据库和最好的硬件大约十年了,所以我两者都是有偏见和怀疑。
Berkeley DB 具有可以在事务句柄上设置的标志,这些标志可以模仿这个和其他 similar methods以牺牲耐久性(ACID 中的“D”)换取速度。
至于如何让 Berkeley DB Java 版 (BDB-JE) 更快,您可以尝试以下方法:
- 延迟写入:延迟写入 只要到事务日志 可能的(当缓冲区已满时,它 刷新数据)
- 提前对 key 进行排序:大多数 B-Trees(包括我们的)做很多事情 更好的按顺序插入 快速加载时间-
- 增加日志的大小 文件从默认的 10MiB 到 更大的东西,比如 100MiB,这个 降低 I/O 成本-
明确关于数据库性能的声明非常重要。它们看起来很简单,但要正确处理它们非常棘手,这样它们就不会损坏数据或丢失已提交的事务。
希望对你有所帮助。
关于performance - Berkeley DB Java 版 - 调整大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3283697/