繁体   English   中英

LevelDB与std :: map

[英]LevelDB vs. std::map

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

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

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

更具体地说,任何人都可以解释一下LevelDB是否比std::map更好?

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

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性能是最重要的。

你现在正在做的是:

假设您在文件中有1000000条记录。 您将整个文件读入std :: map,这需要大约1000000次操作。 您使用find / insert来定位和/或插入元素,这需要对数时间(大约20次比较)。 现在再次保存整个文件,将所有这1000000条记录传回文件。

问题是你使用std :: map绝对没有任何好处。 std :: map为您提供快速搜索时间(对数),但每次查找初始化和序列化整个地图会使其无效。

您需要的是重新设计您的程序,以便在启动时加载一次地图并在终止时将其序列化一次。 或者,如果您需要数据库语义,可以选择真正的数据库实现。 我建议使用SQLite,虽然LevelDB可能对你有好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM