我需要将超过10亿个密钥加载到Berkley DB中,因此我想提前调整它以获得更好的性能.使用标准配置,我现在花了大约15分钟加载1'000'000键,这太慢了.是否有适当的方法来调整例如Berkley DB的B + Tree(节点大小等...)?
(作为比较,在调整tokyo cabinet之后,它在25分钟内加载10亿个键).
PS我正在寻找调优技巧作为代码而不是为运行系统设置的参数(如jvm size等...)
我很好奇,当TokyoCabinet在25分钟内加载1B键时,存储键/值的大小是多少?您正在使用的I/O系统和存储系统是什么?您是否使用术语"加载"来表示1B事务提交到永久稳定存储?这将是~666,666次插入/秒,鉴于我所知道的任何I/O系统,这在物理上是不可能的.将该数字乘以键和值的大小,现在您无法超越物理极限.
请查看Gustavo Duarte的博客,阅读有关I/O系统以及硬件如何工作的内容,然后查看您的陈述.我很想知道TokyoCabinet正在做什么以及它没做什么.如果我不得不猜测我会说它是在操作系统中提交文件系统缓存,而不是将这些缓冲区刷新到磁盘上(fdsync()).
完全披露:我是Oracle for Oracle Berkeley DB(TokyoCabinet的直接竞争对手)的产品经理,我一直在玩这些数据库和最好的硬件大约十年,所以我既有偏见又持怀疑态度.
Berkeley DB的有标志,你可以在交易手柄模仿这和其他设置类似的方法的交易关耐久性(以下简称"d"在ACID)的速度.
至于如何更快地制作Berkeley DB Java版(BDB-JE),您可以尝试以下方法:
延迟写入:这会延迟写入事务日志的时间尽可能长(当缓冲区已满时,它会刷新数据)
排序您事先键:最B-树(包括我们)做按顺序插入好得多的快速负载时间内─
从10MiB的默认更大的东西增加日志文件的大小,像100MiB,这样可以减少I/O成本
明确有关数据库性能的声明非常重要.他们似乎很简单,但事实证明是非常非常棘手,让他们的权利,让他们永远不要损坏数据或丢失已提交的事务.
我希望这对你有所帮助.