我目前正在研究一个非常大的遗留应用程序,它处理从各种来源收集的大量字符串数据(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];
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用这个缓存......
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;
}
Run Code Online (Sandbox Code Playgroud)
由于字符串是不可变的,并且框架完成了许多内部工作以使它们以类似于值类型的方式工作,我一半认为这只会将每个字符串的副本创建到字典中并且只需将其加倍使用的内存而不是仅仅传递对字典中存储的字符串的引用(这是我的同事所假设的).
因此,考虑到这将在大量字符串数据上运行...
这是否会节省任何内存,假设30%的字符串值将被使用两次或更多次?
假设这甚至可以正常工作吗?