【发布时间】:2014-04-28 09:36:09
【问题描述】:
我试图优化特定服务的内存使用,偶然发现了一个巨大的字典缓存,该缓存非常频繁地被查询随机条目。问题是这本词典占用了超过 1 GB 的空间,而服务几乎触及 2GB(32 位)。字典一旦构建就永远不会改变。
字典键和值是字符串。有没有办法压缩整个字典并且它仍然被索引?我编写了一个小型 POC,它在所有条目之间使用 Huffman 编码共享代码,并在压缩键上进行索引。但我想知道是否有更好的选择。
由于各种原因,我必须排除的选项 - 使用数据库或外部存储,因为它变得非常慢& - 所有条目在几分钟内至少使用一次,所以我也排除了延迟加载。 - 使用分布式缓存
【问题讨论】:
-
什么样的钥匙?键是否在一定程度上相似?像“ABC”、“ABD”、“ABE”等?另外,这些值是从哪里获得的,它们可以重复吗?
-
字符串重复很多吗?让他们实习可能是一个快速的胜利。
-
请注意,这个问题对于 Stack Overflow 来说过于宽泛,因为很可能只有讨论才能为您提供答案。
-
@Rahul 从概念上讲,移动到最不常用算法并将未使用的密钥移动到本地文件存储中,可能按首字母拆分文件。如果您碰巧从文件中加载它们,请保留一小部分内存并使用最近最少使用来保持它的维护,只是为了对抗快速引用几次但以后再也不会引用的情况。不用说,
Dictionary本身不会给你任何这些。 -
通常在缓存中消耗最多的空间不是键,而是值,尤其是在存储数组时。所以压缩或重用密钥不会有太大帮助。如今,内存空间通常不是高成本资源。迁移到 x64 进程不是一种选择吗?如果您更紧密地打包缓存 - 这会降低读取性能
标签: c# memory dictionary huffman-code