我有一个可能产生大量数据的C++程序 - 数十亿个不同大小的二进制记录,最可能少于256个字节但有几个延伸到几个K.大多数记录很少被查看程序创建后,但有些将定期访问和修改.没有办法分辨它们何时被创建.
考虑到数据量,我无法将其全部存储在内存中.但由于数据只需要通过其编号(64位整数)进行索引和访问,因此我不需要成熟的数据库程序的开销.理想情况下,我希望将其视为std::map
存储在磁盘上的数据,直到请求为止.
是否有一个已经编写的库可以完成我正在寻找的工作,或者我是否需要自己编写?
编辑:经过一番思考后,我意识到Rob Walker的答案有一个有用的观点:我很难从一个真正的数据库获得的家庭酿造类中获得与数据完整性相同的任何地方. .
虽然BerkeleyDB(正如RHM所建议的)看起来就像我们正在寻找的那样,但双重许可是我们不想处理的头痛问题.当我们完成代码并且可以证明它会从BerkeleyDB(它可能会)中获益时,我们将重新审视该问题.
我确实看过Ferruccio对stxxl的建议,但是我无法告诉它如何处理被中断和重启的程序(可能有更改).有了这么多的数据,我不想废弃它已经完成的东西并且每次重新开始,如果可以保存一些数据的话.
所以我们决定使用SQLite数据库,至少在初始开发时使用.感谢所有回答或投票的人.
看看STXXL.
stxxl::map<>
看起来它完全符合您的需求.
我怀疑你会找到一个完全符合你要求的库,所以你必须决定什么'功能'对你真正重要,然后决定现有的数据库解决方案是否足够接近.
数十亿条记录无论如何都是一个庞大的数据集.记录的生成率是多少?他们坚持多久了?访问模式是否随时间而变化?
更新是否总是与原始数据量相同?
我建议明确证明数据库解决方案在开始自己开发之前不会工作,特别是如果数据的完整性是最重要的(通常是......)在磁盘上可靠地保持数据量绝对可以一个挑战.更改数据时是否需要任何类型的事务语义?客户端是多线程的吗?