在我们的应用程序中,我们使用std::map
来存储(键,值)数据,并使用序列化将该数据存储在磁盘上。通过这种方法,我们发现磁盘I / O是性能瓶颈,使用密钥查找值不是很快。
我遇到过LevelDB并且正在考虑使用它。但我有一些问题。
std::map
和LevelDB之间的区别在于LevelDB是持久的,std::map
在内存中工作。这是否意味着磁盘I / O瓶颈对于levelDB来说会更成问题。 更具体地说,任何人都能解释一下LevelDB是否比std::map
更好?
PS:我尝试使用hash_map
,但似乎比std::map
答案 0 :(得分:8)
LevelDB只是做了比std :: map更多的事情。
你真的说你想要std :: map的高性能持久性吗?
使用自定义分配器查看std :: map。从内存映射区域分配条目并使用fsync确保信息在战略时刻到达磁盘。
或许可以将它与EASTL结合使用(它拥有更快的std :: map并且可以使用自定义分配器 - 它实际上没有默认分配器)
看看调整你的hash_map(std :: unorderded_map);如果hash_maps较慢,你应该研究(a)loadfactor(b)哈希函数调优
最后但并非最不重要:评估使用Boost Serialization进行地图的二进制序列化(无论您选择哪种实现)。根据我的经验,Boost Serialization性能是最重要的。
答案 1 :(得分:2)
你现在正在做的是:
假设您在文件中有1000000条记录。您将整个文件读入std :: map,这需要大约1000000次操作。您使用find / insert来定位和/或插入元素,这需要对数时间(大约20次比较)。现在,您再次保存整个文件,将所有这1000000条记录传回文件。
问题是你使用std :: map绝对没有任何好处。 std :: map为您提供快速搜索时间(对数),但每次查找初始化和序列化整个地图会使其无效。
您需要的是重新设计程序,以便在启动时加载一次地图并在终止时将其序列化一次。或者,如果您需要数据库语义,可以选择真正的数据库实现。我建议使用SQLite,虽然LevelDB可能对你有好处。