想象一下,我正在计算一些大量字符串(即1亿)的双重类型得分,并且我希望有一种缓存效果,以便在必要时重复使用我迄今为止计算的内容。现在,执行此操作的明智方法是将这些频繁的字符串及其分数存储在地图中,以减少内存使用量。对此有什么标准解决方案吗?
答案 0 :(得分:0)
Bloom过滤器以及地图或Hashmaps
我假设你提到有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过滤器会告诉您数据存在的可能性,从而阻止磁盘读取。
我会以排序的方式建议故事磁盘上的大量字符串,索引由键组成 - &gt;磁盘地址映射。
答案主要受到卡桑德拉的启发