【发布时间】:2013-05-14 05:37:39
【问题描述】:
我目前正在开发一个非常大的遗留应用程序,它处理从各种来源(IE、名称、标识符、与业务相关的通用代码等)收集的大量字符串数据。在申请过程中,仅此数据一项就可能占用多达 200 兆内存。
我的一位同事提到了一种减少内存占用的可能策略(因为许多单独的字符串在数据集中是重复的),就是将重复出现的字符串“缓存”在字典中,并在以下情况下重新使用它们必需的。比如……
public class StringCacher()
{
public readonly Dictionary<string, string> _stringCache;
public StringCacher()
{
_stringCache = new Dictionary<string, string>();
}
public string AddOrReuse(string stringToCache)
{
if (_stringCache.ContainsKey(stringToCache)
_stringCache[stringToCache] = stringToCache;
return _stringCache[stringToCache];
}
}
那么要使用这个缓存...
public IEnumerable<string> IncomingData()
{
var stringCache = new StringCacher();
var dataList = new List<string>();
// Add the data, a fair amount of the strings will be the same.
dataList.Add(stringCache.AddOrReuse("AAAA"));
dataList.Add(stringCache.AddOrReuse("BBBB"));
dataList.Add(stringCache.AddOrReuse("AAAA"));
dataList.Add(stringCache.AddOrReuse("CCCC"));
dataList.Add(stringCache.AddOrReuse("AAAA"));
return dataList;
}
由于字符串是不可变的,并且框架完成了许多内部工作以使它们以类似于值类型的方式工作,我有一半认为这只会将每个字符串的副本创建到字典中,并且只是将使用的内存量翻倍,而不是只传递对存储在字典中的字符串的引用(这是我同事的假设)。
所以考虑到这将在大量字符串数据上运行...
假设 30% 的字符串值将被使用两次或更多,这是否会节省内存?
这样的假设是否正确?
【问题讨论】:
-
这是一个错误,30% 不足以证明让你的程序慢一百倍。 RAM 便宜又丰富,8 GB 需要 67 美元。 1.64 美元你写不出一行代码
-
+1 @HansPassant 计算时间与 RAM 投资回报率。
-
@HansPassant 感谢您指出这一点。我会确保在实施时进行性能测试。我同意,这些天你的普通 PC 中的内存非常便宜,但不幸的是,当谈到大型金融机构的生产工作站时,所有内存(和任何其他部件)都必须通过特定的供应商购买和安装,推动每个工作站 8 gig 到 500 多美元的实际成本。将其乘以 1000 多个用户,您就会明白为什么机器升级不是一个真正的选择。