LevelDB vs. std::map

LevelDB vs. std::map

本文关键字:map std vs LevelDB      更新时间:2023-10-16

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

我遇到了LevelDB,并考虑使用它。但是我有一些问题。

  1. LevelDB的文档说它的(string, string)键值对。这是否意味着我不能使用自定义键值对?
  2. 似乎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
    • boost iostreams内存映射文件
  • 可能将它与EASTL(它拥有更快的std::map,并在自定义分配器中茁壮成长-实际上它们没有默认分配器)结合起来

    • EASTL
  • 看看你的hash_map (std::unorderded_map);如果hash_maps较慢,则应该查看(a) loadfactor (b)哈希函数调优

    • 文档
  • 最后但并非最不重要的:评估Boost Serialization对map二进制序列化的使用(无论您选择哪种实现)。根据我的经验,Boost序列化的性能是最高的。

    • 提高序列化

你现在做的是:

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

问题是使用std::map对您没有任何好处。Std::map为您提供了快速的搜索时间(对数),但是每次查找时初始化和序列化整个映射会抵消它的优点。

你需要的是重新设计你的程序,这样你就可以在启动时加载地图,并在结束时序列化它。或者,如果需要数据库语义,可以使用真正的数据库实现。我建议使用SQLite,虽然LevelDB可能对你同样好。

相关文章: