C中的LRU缓存设计,大小有限

我现在正致力于移动平台上的内存非常小的软件。在I / O瓶颈功能中,我需要使用搜索操作从img文件中读取一些字节(您可以假设搜索速度比直接从memmry读取的速度慢10倍)。在我的测试中,这个函数被称为7480325次并从bytes_offset 6800到130000读取字节,因此每个字节平均读取100次(一些字节读取3~4次,一些超过1000次)。 以下是我的统计数据。
bytes offset 6800 ~ 6900: 170884 times
bytes offset 6900 ~ 7000: 220944 times
bytes offset 7000 ~ 7100: 24216 times
bytes offset 7100 ~ 7200: 9576 times
bytes offset 7200 ~ 7300: 14813 times
bytes offset 7300 ~ 7400: 22109 times
bytes offset 7400 ~ 7500: 19748 times
bytes offset 7500 ~ 7600: 43110 times
bytes offset 7600 ~ 7700: 157976 times
...
bytes offset 121200 ~ 121300: 1514 times
bytes offset 121300 ~ 121400: 802 times
bytes offset 121400 ~ 121500: 606 times
bytes offset 121500 ~ 121600: 444 times
bytes offset 121600 ~ 121700: 398 times

max_bytes_offset 121703
min_bytes_offset 6848
然后我想使用LRU模式构建一个缓存,以提高I / O性能。在其他一些问题中,我发现哈希表+双向链表是一个好方法。但是如何建立一个以最佳方式改善我的问题的结构呢?我计划构建1300个桶,每个桶都拥有一个最大大小为10的双向链表。然后它占用的总内存大约为13KB。实施和维护简单,但我认为效率并不是最好的。 在我的统计中,一些字节偏移间隔具有更多的命中率,而一些间隔具有更少的命中率。如何构建一个结构来调整我的统计数据? 当我搜索一个密钥时,我需要遍历大小为10的整个列表。还有其他方法可以提高搜索效率吗? 在某些移动平台中,更多内存可用于缓存,而其他平台允许更少。除了更改存储桶的大小外,如何使缓存调整允许的内存更改? 似乎caf的方法更好。使用一个大的双向链表和一个大的哈希表映射键到节点条目更有意义,并且更多地利用了LRU。但设计散列函数正成为一个难题。 我在等你的建议,谢谢〜     
已邀请:
如果你在每个桶中最多只有10个条目,那么你可能最好不要使用双向链表并只使每个桶成为一个圆形阵列(这只是10个条目和一个“顶部”列表“索引”。 您甚至可以更好地放弃10路组关联设计并使用直接映射缓存(其中您有一个更大的哈希表,每个桶只存储一个条目)。集合关联设计在硬件方面很好,你可以使用专用硬件并行进行n路比较,但在软件中并没有那么多(除非你有一个矢量单元,你可以利用它)。 适应统计信息的一种方法是设计散列函数,以便将不同大小的地址范围映射到每个存储桶,这样每个存储桶的访问频率大致相等。 更改哈希表的大小是缩放缓存大小的另一种显而易见的方法。     

要回复问题请先登录注册