7

几天前我刚开始使用 Berkeley DB,所以我想看看在尽可能快地存储数据方面是否有我遗漏的东西。

以下是有关数据的一些信息: - 它以 512 字节块的形式出现 - 块按顺序排列 - 块将按 FIFO 顺序删除 - 如果我由于电源故障而丢失了一些数据,只要整个 db 没有问题就可以了坏了

在阅读了一堆文档之后,似乎 Queue db 正是我想要的。

然而,在尝试了一些测试代码之后,我最快的结果是大约每秒 1MByte,只是循环通过设置了 DB_APPEND 的 DB->put。我也尝试过使用交易和大宗看跌期权,但这两种方式都大大减慢了速度,所以我没有很长时间追求它们。我正在插入在我的飞思卡尔 i.MX35 开发板上的 NANDFlash 芯片上创建的新数据库。

由于我们希望获得至少每秒 2MBytes 的写入速度,我想知道是否有什么我错过的东西可以提高我的速度,因为我知道我的硬件可以写得比这更快。

4

2 回答 2

9

尝试将其放入您的 DB_CONFIG:

set_flags DB_TXN_WRITE_NOSYNC
set_flags DB_TXN_NOSYNC

根据我的经验,这些可以大大提高写入性能。


DB_TXN_NOSYNC 如果设置,Berkeley DB 将不会在事务提交或准备时写入或同步刷新日志。这意味着事务表现出 ACI(原子性、一致性和隔离性)属性,而不是 D(持久性);也就是说,将保持数据库的完整性,但如果应用程序或系统出现故障,则有可能在恢复期间撤消一些最近提交的事务。有风险的事务数取决于日志缓冲区可以容纳多少日志更新、操作系统将脏缓冲区刷新到磁盘的频率以及日志被检查点的频率。使用 DB_TXN_NOSYNC 标志调用 DB_EN​​V->set_flags 只会影响指定的 DB_EN​​V 句柄(以及在该句柄范围内打开的任何其他 Berkeley DB 句柄)。为了在整个环境中保持一致的行为,

DB_TXN_NOSYNC 标志可用于在应用程序生命周期内的任何时间配置 Berkeley DB。


DB_TXN_WRITE_NOSYNC 如果设置,Berkeley DB 将写入事务提交或准备时的日志,但不会同步刷新。这意味着事务表现出 ACI(原子性、一致性和隔离性)属性,而不是 D(持久性);也就是说,将保持数据库的完整性,但如果系统出现故障,则有可能在恢复期间撤消一些最近提交的事务。有风险的事务数量取决于系统将脏缓冲区刷新到磁盘的频率以及日志检查点的频率。使用 DB_TXN_WRITE_NOSYNC 标志调用 DB_EN​​V->set_flags 只会影响指定的 DB_EN​​V 句柄(以及在该句柄范围内打开的任何其他 Berkeley DB 句柄)。为了在整个环境中保持一致的行为,

DB_TXN_WRITE_NOSYNC 标志可用于在应用程序生命周期内的任何时间配置 Berkeley DB。

有关详细信息,请参阅http://www.mathematik.uni-ulm.de/help/BerkeleyDB/api_c/env_set_flags.html 。

于 2010-09-29T19:29:13.957 回答
2

我建议您必须使用事务/TDS 数据存储,如果您提到如果数据库损坏无法重新创建数据库(即它不仅仅是本地缓存)。如果您不关心在发生崩溃/断电时丢失一些项目,那么 DB_TXN_WRITE_NOSYNC 将提高 TDS 性能,您的数据库仍然是完整的和可恢复的。如果您使用 BTREE 和数字索引(如果您没有自然键)存储并注意字节序问题,以便获得良好的键局部性和高页面利用率,那么您应该能够每秒获得超过 2000 次插入,尤其是SSD,特别是如果您使用 DbMultileKeyDataBuilder 进行批量插入。

于 2010-11-10T01:22:20.270 回答