我几天前刚开始玩Berkeley DB,所以我试图看看在尽可能快地存储数据时是否有一些我一直缺失的东西。
以下是有关数据的一些信息: - 它有512字节的块 - 大块整齐排列 - 将按FIFO顺序删除块 - 如果由于断电而丢失一些数据,只要整个数据库没有被破坏就可以了
在阅读了一堆文档后,看起来像Queue数据库正好是我想要的。
然而,在尝试了一些测试代码之后,我的最快结果大约是每秒1MByte,只需循环通过DB->放置DB_APPEND设置。我也尝试过使用交易和批量看跌期权,但这些都放慢了速度,所以我没有追求它们很长时间。我插入了在我的飞思卡尔i.MX35开发板上的NANDFlash芯片上创建的新数据库。
由于我们希望每秒至少获得2MB的写入速度,我想知道是否有一些我错过的可以提高速度的东西,因为我知道我的硬件可以写得比这更快。
答案 0 :(得分:8)
尝试将其放入DB_CONFIG:
set_flags DB_TXN_WRITE_NOSYNC
set_flags DB_TXN_NOSYNC
根据我的经验,这些会大大提高写入性能。
DB_TXN_NOSYNC
如果设置,Berkeley DB将不会写入或同步刷新事务提交或准备日志。这意味着事务表现出ACI(原子性,一致性和隔离性)属性,但不表现出D(持久性);也就是说,将维护数据库完整性,但如果应用程序或系统出现故障,则可能在恢复期间撤消一些最近提交的事务。受风险的事务数量取决于日志缓冲区可以容纳多少日志更新,操作系统将脏缓冲区刷新到磁盘的频率以及日志检查点的频率 使用DB_TXN_NOSYNC标志调用DB_ENV-> set_flags只会影响指定的DB_ENV句柄(以及在该句柄范围内打开的任何其他Berkeley DB句柄)。为了在整个环境中保持一致的行为,在环境中打开的所有DB_ENV句柄都必须设置DB_TXN_NOSYNC标志,或者应在DB_CONFIG配置文件中指定标志。DB_TXN_NOSYNC标志可用于在应用程序生命周期内的任何时间配置Berkeley DB。
DB_TXN_WRITE_NOSYNC
如果设置,Berkeley DB将写入,但不会同步刷新,登录事务提交或准备。这意味着事务表现出ACI(原子性,一致性和隔离性)属性,但不表现出D(持久性);也就是说,将维护数据库完整性,但如果系统出现故障,则可能在恢复期间撤消一些最近提交的事务。受风险的事务数量取决于系统将脏缓冲区刷新到磁盘的频率以及检查点日志的频率。 使用DB_TXN_WRITE_NOSYNC标志调用DB_ENV-> set_flags仅影响指定的DB_ENV句柄(以及在该句柄范围内打开的任何其他Berkeley DB句柄)。为了在整个环境中保持一致的行为,环境中打开的所有DB_ENV句柄必须设置DB_TXN_WRITE_NOSYNC标志,或者应在DB_CONFIG配置文件中指定标志。DB_TXN_WRITE_NOSYNC标志可用于在应用程序生命周期内的任何时间配置Berkeley DB。
有关详细信息,请参阅http://www.mathematik.uni-ulm.de/help/BerkeleyDB/api_c/env_set_flags.html。
答案 1 :(得分:1)
我建议你必须使用事务/ TDS数据存储,如果你提到你不能重建数据库(即它不仅仅是一个本地缓存),如果它被破坏了。如果你不关心在发生崩溃/断电时丢失一些物品,那么DB_TXN_WRITE_NOSYNC将提高TDS性能,你的数据库仍然是不可或缺的。 如果您使用BTREE和数字索引存储(如果您没有自然键)并注意端点问题,那么您获得良好的密钥位置和高页面利用率,那么您应该能够获得超过2000次插入,特别是SSD,特别是如果您使用DbMultileKeyDataBuilder进行批量插入。