LevelDB与STD :: MAP
-
25-10-2019 - |
题
在我们的应用中,我们使用 std::map
存储(键,值)数据并使用序列化将数据存储在磁盘上。通过这种方法,我们发现磁盘I/O是性能瓶颈,并且使用键找到值并不快。
我遇到了LevelDB并考虑使用它。但是我有一些问题。
- LevelDB的文档表示其为(字符串,字符串)键值对制作。这是否意味着我不能用于自定义钥匙值对?
- 似乎是
std::map
LevelDB是LevelDB是持久的,并且std::map
在内存中起作用。因此,这意味着对于LevelDB而言,磁盘I/O瓶颈将更加问题。
更具体地,任何人都可以解释一下LevelDB是否可以比 std::map
?
PS:我尝试使用 hash_map
S但是它似乎比 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可能对您同样有益。