Berkeley DB Java版 - 调整大量数据

时间:2010-07-19 18:03:20

标签: performance berkeley-db-je

我需要在Berkley DB中加载超过10亿个密钥,因此我想提前调整它以获得更好的性能。使用标准配置,我现在花了大约15分钟加载1'000'000键,这太慢了。 是否有适当的方法来调整例如Berkley DB的B + Tree(节点大小等等)?

(作为比较,在调整东京机柜后,它在25分钟内加载10亿个键。)

P.S。 我正在寻找调优技巧作为代码而不是为正在运行的系统设置的参数(如jvm size等...)

2 个答案:

答案 0 :(得分:6)

我很好奇,当TokyoCabinet在25分钟内加载1B键时,存储的键/值的大小是多少?您正在使用的I / O系统和存储系统是什么?您是否使用术语“加载”来表示1B事务提交到永久稳定存储?这将是~666,666次插入/秒,鉴于我所知道的任何I / O系统,这在物理上是不可能的。将该数字乘以键和值的大小,现在您无法超越物理极限。

请查看Gustavo Duarte的博客,阅读有关I / O系统以及硬件如何工作的内容,然后查看您的陈述。我很想知道TokyoCabinet正在做什么以及它没做什么。如果我不得不猜测我会说它在操作系统中提交文件系统缓存,而不是将这些缓冲区刷新(fdsync() - )到磁盘。

完全披露:我是Oracle for Oracle Berkeley DB(TokyoCabinet的直接竞争对手)的产品经理,我一直在玩这些数据库和最好的硬件大约十年,所以我都是有偏见和持怀疑态度。

Berkeley DB有可以在交易句柄上设置的标志,它可以模拟这个以及其他similar methods交易关闭持久性(ACID中的“D”)的速度。

至于如何更快地制作Berkeley DB Java版(BDB-JE),您可以尝试以下方法:

  • 延迟写道:这延迟了写作 只要到事务日志 可能(当缓冲区已满时,它 刷新数据)
  • 提前排序:大多数 B树(包括我们的)做了很多 更好的顺序插入 快速加载时间 -
  • 增加日志的大小 文件默认为10MiB到 更大的东西,比如100MiB,这个 降低I / O成本 -

明确有关数据库性能的声明非常重要。它们看起来很简单,但结果是非常非常棘手,以至于它们不会破坏数据或丢失已提交的事务。

我希望这对你有所帮助。

答案 1 :(得分:0)

如果将BDB-JE分组到单个事务中,则BDB-JE上的批量插入会快一个数量级。原因是每次单个提交都会导致(默认情况下)同步写入磁盘,而事务在提交时同步。在我的应用程序中,编写100&000; 000个小密钥作为单个提交需要花费一分多钟时间,而在事务中只需几秒钟。