我需要将超过10亿个键加载到Berkley DB中,因此我希望提前调优它以获得更好的性能。在标准配置下,我现在需要大约15分钟来加载1'000'000个密钥,这太慢了。有没有一种适当的方法来调优例如Berkley DB的B+Tree (节点大小等)?
(作为对比,在调整东京机柜后,它在25分钟内加载了10亿个密钥)。
附言:我正在寻找作为代码的调优提示,而不是为运行的系统设置的参数(如jvm大小等)
发布于 2010-10-30 04:10:38
我很好奇,当TokyoCabinet在25分钟内加载1B密钥时,存储的密钥/值的大小是多少?您使用的I/O系统和存储系统是什么?您是否使用术语"load“来表示对永久稳定存储的1B事务提交?这将是大约666,666次插入/秒,对于我所知道的任何I/O系统,这在物理上都是不可能的。将这个数字乘以键和值的大小,现在你已经无可救药地超出了物理限制。
请看一下Gustavo Duarte的博客,读一些关于I/O系统和硬件是如何工作的,然后查看你的声明。我很有兴趣找出TokyoCabinet到底在做什么,它没有在做什么。如果我必须猜测,我会说要么是提交给操作系统中的文件系统缓存,而不是将这些缓冲区刷新(fdsync()-ing)到磁盘。
全面披露:我是甲骨文的Oracle Berkeley DB (TokyoCabinet的直接竞争对手)的产品经理,我已经使用这些数据库和最好的硬件大约十年了,所以我既有偏见又持怀疑态度。
Berkeley DB有一些标记,您可以在事务句柄上设置这些标记,以模拟这一点和其他similar methods,以牺牲耐用性(ACID中的"D“)来换取速度。
至于如何使Berkeley DB Java Edition (BDB-JE)更快,您可以尝试以下方法:
弄清楚数据库的性能声明是非常重要的。它们看起来很简单,但事实证明,要正确地处理它们是非常非常棘手的,这样它们就不会损坏数据或丢失提交的事务。
我希望这能对你有所帮助。
发布于 2014-09-17 15:16:06
如果将BDB-JE上的批量插入分组到单个事务中,则它们的速度要快一个数量级。原因是,每次提交都会导致(默认情况下)对磁盘的同步写入,而事务在提交时进行同步。在我的应用程序中,将100,000个小键作为单个提交编写需要超过一分钟,而在一个事务中,这只需要几秒钟。
https://stackoverflow.com/questions/3283697
复制相似问题