LevelDB与std :: map

时间:2011-10-18 08:55:04

标签: c++ stdmap boost-serialization leveldb

在我们的应用程序中,我们使用std::map来存储(键,值)数据,并使用序列化将该数据存储在磁盘上。通过这种方法,我们发现磁盘I / O是性能瓶颈,使用密钥查找值不是很快。

我遇到过LevelDB并且正在考虑使用它。但我有一些问题。

  1. LevelDB的文档说明它是(字符串,字符串)键值对。这是否意味着我不能用于自定义键值对?
  2. 似乎std::map和LevelDB之间的区别在于LevelDB是持久的,std::map在内存中工作。这是否意味着磁盘I / O瓶颈对于levelDB来说会更成问题。
  3. 更具体地说,任何人都能解释一下LevelDB是否比std::map更好?

    PS:我尝试使用hash_map,但似乎比std::map

2 个答案:

答案 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可能对你有好处。