首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LevelDB与std::map

LevelDB与std::map
EN

Stack Overflow用户
提问于 2011-10-18 08:55:04
回答 2查看 4.2K关注 0票数 7

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

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

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

更具体地说,谁能解释一下LevelDB是否比std::map更好的选择?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-18 10:12:03

LevelDB只是做了一些事情,而不是std::map。

你真的想要(高性能)的std::map的持久性吗?

  • 查看std::map与自定义分配器。从内存映射区域分配条目,并使用fsync确保信息在关键时刻到达磁盘。
代码语言:javascript
复制
- [mmap](http://linux.die.net/man/2/mmap)
- [boost iostreams memory mapped files](http://www.boost.org/doc/libs/1_47_0/libs/iostreams/doc/classes/mapped_file.html)

  • 也许将其与EASTL结合起来(EASTL拥有更快的std::map,并与自定义分配器蓬勃发展--实际上它们没有默认的分配器)
代码语言:javascript
复制
- [EASTL](https://github.com/paulhodge/EASTL)

  • 查看如何优化您的hash_map (std::unorderded_map);如果hash_maps速度较慢,则应研究(a)加载因子(b)哈希函数优化
代码语言:javascript
复制
- [docs](http://msdn.microsoft.com/en-us/library/bb982704.aspx)

  • 最后但并非最不重要的一点是:评估Boost Serialization在映射的二进制序列化中的使用情况(无论您选择什么实现)。根据我的经验,提升序列化性能是最重要的。
代码语言:javascript
复制
- [Boost serialization](http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/tutorial.html#stl)

票数 9
EN

Stack Overflow用户

发布于 2011-10-18 10:16:19

你现在要做的是:

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7804692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档