在我们的应用程序中,我们使用std::map存储(键、值)数据,并使用序列化将数据存储在磁盘上。通过这种方法,我们发现磁盘I/O是性能瓶颈,使用键查找值不是很快。
我遇到了LevelDB,并考虑使用它。但我有一些问题。
std::map和LevelDB的区别似乎在于LevelDB是持久的,std::map在内存中工作。因此,这是否意味着磁盘I/O瓶颈对于levelDB来说会更成问题。更具体地说,谁能解释一下LevelDB是否比std::map更好的选择?
PS:我试过使用hash_map,但它似乎比std::map慢
发布于 2011-10-18 10:12:03
LevelDB只是做了一些事情,而不是std::map。
你真的想要(高性能)的std::map的持久性吗?
- [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](https://github.com/paulhodge/EASTL)
- [docs](http://msdn.microsoft.com/en-us/library/bb982704.aspx)
- [Boost serialization](http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/tutorial.html#stl)
发布于 2011-10-18 10:16:19
你现在要做的是:
假设你在一个文件中有1000000条记录。将整个文件读入std::map,这需要大约1000000次操作。使用find/insert来定位和/或插入元素,这需要对数时间(大约20次比较)。现在您再次保存整个文件,将所有这1000000条记录传输回该文件。
问题是,使用std::map绝对没有任何好处。地图给你快速的搜索时间(对数),但是每次查找初始化和序列化整个地图都会使它的好处化为乌有。
您需要的要么是重新设计程序,以便在启动时加载映射一次,然后在终止时将其序列化一次。或者,如果您需要数据库语义,可以使用真正的数据库实现。我建议使用SQLite,尽管LevelDB可能对您也有好处。
https://stackoverflow.com/questions/7804692
复制相似问题