C++内存中的键值存储

5
我正在寻找关于内存键值存储引擎或库的建议,需要有C ++接口或使用C ++编写。
我需要的解决方案可以轻松扩展到约100亿个键值对,并且在Linux和Win32 / 64上兼容/可编译。

5
你有任何重复的键或值吗?还是全部都是唯一的? - Chris Bednarski
“需要扩展到大约1亿个键值对”和“在内存中”的要求将会相互矛盾。虽然可以同时满足这两个要求,但首先要问的问题是是否需要同时满足这两个要求。键/值是否真的必须在内存中? - Max Lybbert
1
@Chris:它可以有重复的键,所以它有点像std::multimap或std::multiset。 - Hippicoder
首先,密钥是否都可以提前确定,还是需要能够不断地插入/删除密钥? 如果只是在运行时加载静态表并且只需要查找,将其作为排序数据连续存储在向量中并使用二分查找可能就足够了。 - stinky472
7个回答

12

6
如果您确实需要在内存中存储这么多键值对,请考虑使用Sparse Hash。它有一种特殊的实现方式,可以优化内存消耗。

3

如果键和值的大小很小,可用内存很大(约100万对),那么std::map是很好的选择。如果情况不是这样的,并且您想要在键值对上运行程序,请考虑使用标准MapReduce API。 MapReduce专门用于在分布式系统上处理大量数据,特别是键值对。此外,还有很好的C ++ API可用于MapReduce。

http://en.wikipedia.org/wiki/MapReduce

2

链接已损坏! - scravy

1
尝试使用FastDB,虽然你可能会得到比你要求的更多。东京柜台似乎也支持内存数据库。(或者,由mmap映射的文件支持。随着现代操作系统的发展,“在内存中”的数据库和一些mmap'd的东西之间几乎没有什么区别,因为操作系统缓存也使后者非常高效)。

1
哈希映射(也称为无序映射)是处理如此多键值对的最佳选择。你可以在 Boost 和 TR1 中找到实现。
编辑: 有人对大小提出了疑问- 如果他有一个64位服务器,那么有足够的空间来存储1亿个键值对。

1
我想要一些持久化机制,可以是磁盘或网络。 - Hippicoder
然后你需要获取一个数据库。 - Puppy
在添加或删除时,这可能会导致内存碎片问题。 - NickD

0

你需要的是Oracle Berkeley_db。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接