Attualmente sto lavorando su un'applicazione legacy molto grande che gestisce una grande quantità di dati stringa raccolti da varie fonti (IE, nomi, identificatori, codici comuni relativi al business, ecc.). Questi dati da soli possono richiedere fino a 200 meg di ram nel processo di applicazione.Memorizzazione nella cache. Ottimizzazione della memoria e riutilizzo
Un mio collega ha menzionato una possibile strategia per ridurre l'impronta di memoria (dato che molte stringhe individuali sono duplicate tra i set di dati), sarebbe quella di "memorizzare" le stringhe ricorrenti in un dizionario e riutilizzarle Quando richiesto. Così, per esempio ...
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];
}
}
quindi di utilizzare questo caching ...
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;
}
come stringhe sono immutabili e un sacco di lavoro interno è fatto da quadro per farli lavorare in modo simile a tipi di valore Sto pensando a metà che questo creerà solo una copia di ciascuna stringa nel dizionario e raddoppierà solo la quantità di memoria utilizzata anziché passare semplicemente un riferimento alla stringa memorizzata nel dizionario (che è ciò che il mio collega sta assumendo).
Quindi tenendo conto che questo sarà eseguito su una serie massiccia di dati di stringa ...
è questa intenzione di salvare qualsiasi memoria, partendo dal presupposto che il 30% dei valori di stringa verrà usata due volte o più?
L'ipotesi è che funzioni correttamente?
Questo è un errore, il 30% non è abbastanza per giustificare la realizzazione del programma un centinaio di volte più lento. La RAM è economica e abbondante, 8 gigabyte costano 67 dollari. Non è possibile scrivere una riga di codice per $ 1,64 –
+1 su @HansPassant per calcolare il tempo rispetto alla ROI della RAM. –
@ HansPassant Grazie per aver segnalato questo. Mi assicurerò di eseguire test delle prestazioni durante l'implementazione. Sono d'accordo, quella memoria nel tuo PC medio è sporca a buon mercato in questi giorni, ma sfortunatamente quando si parla di workstation di produzione in un grande istituto finanziario, dove tutta la memoria (e qualsiasi altra parte) deve essere acquistata e installata attraverso un fornitore specifico, spinge il costo reale di 8 gig a oltre 500 dollari per workstation. Moltiplicalo per più di 1000 utenti e puoi capire perché gli aggiornamenti delle macchine non sono realmente un'opzione. – Moog