在我们的应用程序中我们使用std::map
存储(键,值)数据并使用序列化将该数据存储在磁盘上。通过这种方法,我们发现磁盘 I/O 是性能瓶颈,并且使用 key 查找值并不是很快。
我遇到过 LevelDB 并考虑使用它。但我有一些问题。
- LevelDB 的文档说它是为(字符串,字符串)键值对而设计的。这是否意味着我不能用于自定义键值对?
- 看来之间的区别
std::map
而LevelDB是LevelDB是持久化的并且std::map
在内存中工作。那么这是否意味着磁盘I/O瓶颈对于levelDB来说会更加成问题。
更具体地说,任何人都可以解释一下 LevelDB 是否是比std::map
?
PS:我尝试使用hash_map
s 但它似乎比std::map
LevelDB 只是做 std::map 以外的事情。
您真的是说您想要 std::map 的(高性能)持久性吗?
-
使用自定义分配器查看 std::map 。从内存映射区域分配条目并使用 fsync 以确保信息在关键时刻及时到达磁盘。
- mmap http://linux.die.net/man/2/mmap
- boost iostreams 内存映射文件 http://www.boost.org/doc/libs/1_47_0/libs/iostreams/doc/classes/mapped_file.html
-
也许将其与 EASTL 结合起来(它拥有更快的 std::map 并通过自定义分配器蓬勃发展 - 事实上它们没有默认分配器)
- EASTL https://github.com/paulhodge/EASTL
-
看看调整你的 hash_map (std::unorderded_map);如果 hash_maps 较慢,您应该考虑 (a) 负载因子 (b) 哈希函数调整
- docs http://msdn.microsoft.com/en-us/library/bb982704.aspx
-
最后但并非最不重要的一点:评估 Boost Serialization 对映射的二进制序列化的使用(无论您选择什么实现)。根据我的经验,提升序列化性能是最重要的。
- 增强序列化 http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/tutorial.html#stl
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)