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

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

  1. LevelDB的文档表示其为(字符串,字符串)键值对制作。这是否意味着我不能用于自定义钥匙值对?
  2. 似乎是 std::map LevelDB是LevelDB是持久的,并且 std::map 在内存中起作用。因此,这意味着对于LevelDB而言,磁盘I/O瓶颈将更加问题。

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

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

有帮助吗?

解决方案

LevelDB只是在STD :: MAP之外做的其他事情。

您真的是说想要(高性能)STD :: MAP的持久性吗?

  • 使用自定义分配器查看STD :: MAP。分配内存映射区域的条目,并使用FSYNC来确保信息在战略时刻列入磁盘。

  • 也许将其与Eastl(具有更快的STD :: Map and thrive thrive thristators thross the The The The The Wustonators -Eastl结合在一起 - 实际上它们没有默认分配器)

  • 查看调整您的hash_map(std :: unorderded_map);如果hash_maps较慢,则应查看(a)loadFactor(b)哈希功能调整

  • 最后但并非最不重要的一点是:评估Boost序列化用于地图的二进制序列化(您选择的任何实现)的使用。根据我的经验,提高序列化性能是账单的首要任务。

其他提示

您现在正在做的是:

假设您的文件中有1000000个记录。你读了 所有的 将其归档到STD :: MAP中,这大约需要约1000000个操作。您使用查找/插入来定位和/或插入元素,这需要对数时间(大约20个比较)。现在,您再次保存整个文件,将所有这些1000000记录传输回文件。

问题在于,使用STD :: MAP,您绝对不会受益。 STD :: MAP为您提供快速的搜索时间(对数),但是初始化和序列化整个地图每个查找都会使其受益。

您需要的是重新设计您的编程,因此您将在启动时加载地图,然后在终止时序列化一次。或者,也许如果您需要数据库语义,请选择真实的数据库实现。我建议使用sqlite,尽管LevelDB可能对您同样有益。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top