在C++中在地图中存储频繁键

在C++中在地图中存储频繁键,c++,dictionary,C++,Dictionary,假设我正在为大量字符串(即1亿个)计算一个双类型分数,并且我希望有一种缓存效果,以便在需要时重新使用我迄今为止计算的结果。现在,聪明的方法是将那些频繁出现的字符串及其分数存储在地图中,以减少内存使用。有什么标准的解决方案吗?Bloom过滤器与映射或哈希映射一起使用 我假设,正如您提到的,磁盘上可能有100万个字符串,但并非所有字符串都存在 我建议采用两层结构,如下所示: 创建以下格式的哈希映射: std::map<std::string, double> map; 这可能包含最后5

假设我正在为大量字符串(即1亿个)计算一个双类型分数,并且我希望有一种缓存效果,以便在需要时重新使用我迄今为止计算的结果。现在,聪明的方法是将那些频繁出现的字符串及其分数存储在地图中,以减少内存使用。有什么标准的解决方案吗?

Bloom过滤器与映射或哈希映射一起使用

我假设,正如您提到的,磁盘上可能有100万个字符串,但并非所有字符串都存在

我建议采用两层结构,如下所示:

创建以下格式的哈希映射:

std::map<std::string, double> map;
这可能包含最后500个引用条目。如果使用映射,则可以基于TTL制定逐出策略

如果您想要一个基于最近最少使用的驱逐策略,那么您需要稍微调整一下数据结构

std::map<std::string, cached_data> map;

struct cached_data
{
   double value;
   int times_accessed;         //Number of times it has been accessed.
}
插入将变得稍微复杂

现在,当缓存访问失败时,我们该怎么办?如果您实际上没有数据,您不希望不必要地读取磁盘。为此,您可以使用bloomfilter。Bloom filter将告诉您数据存在的可能性,从而防止磁盘读取

我建议以排序的方式在磁盘上存储大量字符串,索引由键->磁盘地址映射组成


答案主要受Cassandra启发

看看std::map,它是一种关联数组,您可以使用std::string作为键,double作为值。您的缓存可以不受限制地增长吗?或者您是在寻找更多的LRU解决方案,即在缓存达到给定的最大大小后,最近未使用的缓存项将被丢弃,以防止其增长larger@JeremyFriesner你刚才提到的,LRU解决方案,听起来像我正在寻找的。@ USS3695357LRU的可以在C++中很容易地在STD之上实现::MAP或STD::unOrdEdjmap和STD::列表…当点击列表节点时,地图提供了对列表节点的快速查找,然后该列表节点被剪掉并移动到列表的前面。在缓存未命中时,您将推到列表的前面并添加到映射,同时从列表和映射中删除最后一项。你可能会在网上找到一些例子。