BerkeleyDB 变胖变慢

Posted

技术标签:

【中文标题】BerkeleyDB 变胖变慢【英文标题】:BerkeleyDB getting fat and slow 【发布时间】:2013-02-28 04:23:27 【问题描述】:

我正在尝试以每秒 50k 的插入速度向 BerkeleyDB 添加 3e9 个键(重复性低),复合记录由具有两个整数的结构形成。每个键的长度为 30。我使用的是 C API。

看起来我必须将 cache_size 增加到 2GB,否则在一段时间后插入数据库会变得非常慢。但是,它总是消耗超过 2GB 的 RAM。

我不使用事务或游标,我使用的是 DB_HASH。

如何确保我不会消耗太多 RAM 并且不会变得太慢?

【问题讨论】:

3 十亿键?!以每秒 50k 的速度,插入几乎需要 17 个小时。 如果您在哪种操作系统中使用固态硬盘 (SSD),性能会大大提高?如果你在一些 unix 下,你可以看看 noatime tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/… @DavidRF 如果我使用 SSD,我会以比每秒 50k 快得多的速度写入数据库,但这并不是特别重要,因为我的应用程序生成数据的速度不那么快。 @MattBall 是的,这不是一个快速的任务 =P 【参考方案1】:

BerekelyDB 尊重用户对 RAM 使用的设置,并将使用允许/配置的尽可能多的 RAM。 如果您希望使用较少的 RAM,请配置较低的值。

同时创建/插入时的 S-L-O-W 可能是由于 BerkeleyDB 为确保新数据在 db->put 之后在磁盘上而进行的 fsync(2) 调用。

您可以通过使用 noop 例程覆盖 fsync(2) 向量来加速 BerkeleyDB (即只返回成功但什么都不做)当你创建数据库和 并不关心数据是否已刷新到磁盘。

【讨论】:

以上是关于BerkeleyDB 变胖变慢的主要内容,如果未能解决你的问题,请参考以下文章

BerkeleyDB 不存储文件

不同的 BerkeleyDB 版本有啥区别,我应该选择哪个?

perl、BerkeleyDB 和 CDS 模式

在 C# 中读取 BerkeleyDB 数据库行

Citadel 如何仅使用 BerkeleyDB 键/值存储来构建数据?

向 BerkeleyDB-JE 插入数据越来越慢