我几天前才开始使用Berkeley DB,所以我想看看在尽可能快地存储数据时,我是否遗漏了什么。
这里有一些关于数据的信息:-它以512字节的区块形式出现-区块是按顺序出现的-区块将按FIFO顺序删除-如果我因为断电而在最后丢失了一些数据,只要整个数据库没有损坏,这就没问题
在阅读了一大堆文档之后,它看起来就像是我想要的队列数据库。
然而,在尝试了一些测试代码后,我的最快结果大约是每秒1兆字节,只是循环通过一个带DB_APPEND设置的DB->put。我也尝试过使用事务和批量but,但这两种方法都大大减慢了速度,所以我没有花太多时间去研究它们。我在我的飞思卡尔i.MX35开发板的NANDFlash芯片上创建了一个新的数据库。
由于我们希望获得每秒至少2M字节的写入速度,我想知道是否有什么我遗漏的东西可以提高我的速度,因为我知道我的硬件可以写得比这个更快。
发布于 2010-09-30 03:29:14
试着把这个放到你的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。
发布于 2010-11-10 09:22:20
我建议你必须使用事务/ TDS数据存储,如果你提到的,你不能重新创建一个数据库(即它不仅仅是一个本地缓存),如果它被破坏了。如果你不关心在崩溃/断电的情况下丢失一些项目,那么DB_TXN_WRITE_NOSYNC将提高TDS性能,你的数据库仍然是完整的和可恢复的。如果您使用BTREE和数字索引进行存储(如果您没有自然键),并注意endian问题,以便获得良好的键位置和高页面利用率,那么您应该能够获得每秒超过2000次插入,特别是对于固态硬盘,特别是当您使用DbMultileKeyDataBuilder进行批量插入时。
https://stackoverflow.com/questions/3825022
复制相似问题