快速嵌入数据库

Cmd*_*ozy 9 c++ database embedded-database data-structures

我正在开发一个应用程序,它需要存储与音乐文件(艺术家,标题,播放计数等)相关的元数据,以及整数集(特别是SHA-1哈希).

我选择的解决方案需要:

  • 提供"快速"存储和检索(当查看可能数千首歌曲的列表时,我需要能够或多或少地以交互方式检索元数据).
  • 跨平台(Linux,Windows和OSX).
  • 提供我可以从C++交互的界面.
  • 是开源的(或者至少是啤酒中的自由).
  • 提供快速设置操作(并集,交集,差异) - 如果解决方案不提供此功能,但它允许我存储二进制数据,我可以使用"快速设置操作使用Treaps"等技术自行实现.
  • 被"嵌入" - 也就是说,在没有我必须进行fork另一个过程的情况下运行,或者至少提供一个简单的界面(如libmysqld).

我考虑的解决方案包括:

  • 平面文件.这非常简单,但除了平面数据存储之外不提供任何功能.
  • SQlite的.这似乎是一个非常受欢迎的选项,但它似乎在性能和并发性方面存在一些问题(有关示例问题,请参阅KDE的Akonadi).
  • 嵌入式MySQL/MariaDB.这似乎是一个合理的选择,但考虑到我不需要很多复杂的SQL功能,它也可能有点重量级.

我认为完美的假设解决方案就像Redis,但它将数据保存到磁盘,并且只将一部分数据存储在内存中以便快速检索.Redis本身可能不是一个好选择因为1)我需要fork手动操作,2)它的Windows端口看起来不那么坚固,3)将所有数据存储在RAM中将不太理想.

对于这类问题是否有其他解决方案,或者我已经列出的解决方案之一远远优于其他解决方案?

Cmd*_*ozy 4

最后,我决定使用 SQlite 来存储元数据。它似乎与 libmysqld 一样快,甚至更快,并且它有一个非常简单干净的 C 接口。根据基准测试,它的速度应该足以满足我的需求。

对于较大的数据结构,我计划将它们存储在单独的二进制文件中(SQlite 网站说它可以存储二进制数据,但如果您的数据大小超过一定数量,则将其存储在平面文件中会更快 - 请参阅这一页)。