首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Berkeley DB Java版-针对大量数据的调优

Berkeley DB Java版-针对大量数据的调优
EN

Stack Overflow用户
提问于 2010-07-20 02:03:20
回答 2查看 4K关注 0票数 3

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

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

附言:我正在寻找作为代码的调优提示,而不是为运行的系统设置的参数(如jvm大小等)

EN

回答 2

Stack Overflow用户

发布于 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)更快,您可以尝试以下方法:

  • 延迟写入:这会将写入事务日志的时间延迟到尽可能长的时间(当缓冲区已满时,它会刷新数据)
  • 提前对键进行排序:大多数B树(包括我们的B树)在按顺序插入快速加载时表现得更好,日志文件的大小从默认的10MiB减少到更大的值,如100MiB,这降低了I/O成本-

弄清楚数据库的性能声明是非常重要的。它们看起来很简单,但事实证明,要正确地处理它们是非常非常棘手的,这样它们就不会损坏数据或丢失提交的事务。

我希望这能对你有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2014-09-17 15:16:06

如果将BDB-JE上的批量插入分组到单个事务中,则它们的速度要快一个数量级。原因是,每次提交都会导致(默认情况下)对磁盘的同步写入,而事务在提交时进行同步。在我的应用程序中,将100,000个小键作为单个提交编写需要超过一分钟,而在一个事务中,这只需要几秒钟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3283697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档