7

我需要编写一个 C++ 应用程序来读取和写入大量数据(超过可用 RAM),但始终以顺序方式进行。

为了将数据保存在未来的证明中并且易于记录,我使用协议缓冲区。然而,协议缓冲区不处理大量数据。

我之前的解决方案包括为每个数据单元创建一个文件(并将它们全部存储在一个目录中),但这似乎不是特别可扩展。

这次我想尝试使用嵌入式数据库。要拥有类似的功能,我只需要存储 key->values 关联(因此 sqlite 似乎有点矫枉过正)。值将是来自 Protocol Buffer 的二进制序列化输出。

我希望数据库能够管理“在内存中保留什么,将什么移动到磁盘 asp”问题,“如何在磁盘上有效地存储大量数据”问题,理想情况下,优化我的顺序读取模式(通过读取之前的下一个条目)。

寻找替代品 我对缺乏替代品感到惊讶。我不想将数据库保留在一个单独的进程中,因为我不需要这种分离(这排除了 redis)。

我发现的唯一选择是 Berkeley DB,但它有一个令人不快的低级 C api。然后,我发现最好的选择是在 Berkeley DB 之上的 stldb4。API 看起来很不错,符合我的需要。

不过我很担心。stldb4似乎很奇怪(它依赖于 libferris 的东西),未维护的解决方案(一年前的最后一个版本),对于一个我认为很常见的问题。

你们中有人对如何管理这个问题有更好的建议吗?

感谢您的回答。

4

3 回答 3

5

我想我已经找到了我的问题的答案。

我没有注意到 Berkeley DB为 C++提供了两个API:

  • 像 API 一样的香草 C
  • STL API

这个 STL API 提供了与 STL 兼容的向量和映射抽象,可以直接访问数据库。这样做value = data_container[key]就成为可能。

这对我来说似乎是最好的解决方案;将 Berkeley DB STL API 直接与 Protocol Buffers 一起使用。

于 2010-07-23T16:02:15.330 回答
2

我建议京都内阁

于 2010-11-29T15:46:52.887 回答
1

BerkleyDB似乎符合您的需求。当然,它的 API 有点笨拙,但如果你想获得一个好的 API,SQLite可能是更好的解决方案,尽管我认为它的性能可能没有那么好。

于 2010-07-23T13:58:57.717 回答