LevelDB vs. std::map
LevelDB vs. std::map
在我们的应用程序中,我们使用std::map
来存储(键,值)数据,并使用序列化将这些数据存储在磁盘上。使用这种方法,我们发现磁盘I/O是性能瓶颈,并且使用key查找值不是很快。
我遇到了LevelDB,并考虑使用它。但是我有一些问题。
- LevelDB的文档说它的(string, string)键值对。这是否意味着我不能使用自定义键值对?
- 似乎
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可能对你同样好。
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 无法在 std::map<std::string,std::shared_ptr 中设置值<class>>
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- issue with std::map std::find
- 为什么 std::map< std::map >不释放内存?
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 确定运行时std::map/std::set的内存使用情况
- 映射上的模板参数无效 std::map< std::string, Stock*> &Stock
- 我的SFINAE检查std::map/std::vector有什么问题
- 使用 std::map<std::string, int> 计算表达式树
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 如何填写和访问 std::map<std::p air<enum1, enum2>, funcPtr>?
- 二进制'<':找不到 map<std::string shared_ptr 的运算符<Foo>>
- 如何将 2 个字符* 数组直接映射到 std::map<std::string,std::string>
- C++ std::map<std::string, int> 获取键以特定字符串开头的值
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏