我目前正在开发一个非常大的遗留应用程序,它处理从各种来源(IE、名称、标识符、与业务相关的通用代码等)收集的大量字符串数据。在应用程序过程中,仅此数据一项就可能占用多达 200 兆内存。
我的一位同事提到了一种减少内存占用的可能策略(因为许多单独的字符串在数据集中是重复的),将在字典中“缓存”重复出现的字符串并在需要时重新使用它们。比如……</p>
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% 的字符串值将被使用两次或更多,这是否会节省内存?
假设这甚至可以正常工作吗?