快速嵌入数据库

时间:2013-07-03 04:01:21

标签: c++ database data-structures embedded-database

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

我选择的解决方案需要:

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

我考虑过的解决方案包括:

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

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

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

2 个答案:

答案 0 :(得分:4)

最后,我决定将SQlite用于元数据。它似乎速度快但不快于例如libmysqld,它有一个非常简单的干净C接口。根据基准测试,它应该足够快,以满足我的需求。

对于较大的数据结构,我打算将它们存储在单独的二进制文件中(SQlite网站说它可以存储二进制数据,但如果你的数据大小超过一定数量,那么将它存储在平面文件中会更快相反 - 见this page)。

答案 1 :(得分:3)

除非您需要大象数据库,否则不要将二进制文件BLOBS存储在SQLite中。只需在文件系统上存储带有路径文件名的字符串。 SQLite的唯一缺点是它不允许远程(Web)访问,但您可以将其嵌入到小型TCP / HTTP服务器中。