私は現在、さまざまなソース (IE、名前、識別子、ビジネスに関連する共通コードなど) から収集された大量の文字列データを処理する非常に大規模なレガシー アプリケーションに取り組んでいます。このデータだけでも、アプリケーション プロセスで最大 200 MB の RAM を使用できます。
私の同僚は、メモリ フットプリントを削減するための 1 つの可能な戦略 (個々の文字列の多くがデータ セット全体で重複しているため) について言及しました。たとえば…</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;
}
文字列は不変であり、値型と同様の方法で機能させるためにフレームワークによって多くの内部作業が行われるため、これは各文字列のコピーを辞書に作成し、量を2倍にするだけだと半分考えていますディクショナリに格納されている文字列への参照を渡すだけでなく、使用されるメモリの量 (これは私の同僚が想定していることです)。
したがって、これが大量の文字列データセットで実行されることを考慮して...
文字列値の 30% が 2 回以上使用されると仮定すると、メモリを節約できますか?
これが正しく機能するという仮定はありますか?