Quanta memoria fisica occupa un file in memoria cache?

Ho fatto qualche prova per vedere quanto spazio occupano in cache,indicativamente, dei file di testo ,i file di testo dovrebbero essere comparabili ,ai fini del test, a file-oggetti json od xml.Ho utilizzato la MemoryCache (.Net,Microsoft.Extensions.Caching.Memory) ed ho preso in considerazione la proprietà WorkingSet64  ,dell'oggetto Process, la quale "Ottiene la quantità di memoria fisica, in byte, allocata per il processo associato".Ho utilizzato un file di testo da circa 30 kbyte ed uno da circa 100kb ,il risultato è che lo spazio usato in memoria fisica dalla cache è circa da 2,2 a 2,8 volte lo spazio dei file su disco :


public class HomeController : Controller
    {
        private IMemoryCache _cache;
        public HomeController(IMemoryCache memoryCache)
        {
            _cache = memoryCache;            
        }  
public IActionResult LoadFile()
        {
            DateTime start = DateTime.Now;
            Process p = Process.GetCurrentProcess();
            long memoriaFisica = p.WorkingSet64;       
            ProcessModel b = new ProcessModel();            
            b.RamIniziale = memoriaFisica;
            MemoryCacheEntryOptions opt = new MemoryCacheEntryOptions();
            opt.Priority = CacheItemPriority.NeverRemove;
            string data = null;
            string path = @"C:\Users\gianmarco\Desktop\SourceCodeSafer.txt"; //30 kb su disco
            string path100 = @"C:\Users\gianmarco\Desktop\SourceCodeSaferda100kb.txt"; //104 kb su disco
            data = System.IO.File.ReadAllText(path);
            int numeroOggettiInCache = 30000;
            long counter = 0;
            Random r = new Random();
            while (counter < numeroOggettiInCache)
            {
                string k = counter.ToString();
                data = data + k.Substring(0,1);
                int position = r.Next(0, 28000);
                data = data.Remove(position, 1);                
                _cache.CreateEntry("cucu" + counter.ToString());
                _cache.Set("cucu" + counter.ToString(), data, opt);                
                counter++;
            }            
            Process p1 = Process.GetCurrentProcess();
            long memoriaFisicaPost = p1.WorkingSet64;          
            b.RamFinale = memoriaFisicaPost;           
            DateTime stop = DateTime.Now;
            TimeSpan span = stop.Subtract(start);
            int seconds = (int)span.TotalSeconds;
            double milliseconds = span.TotalMilliseconds;
            b.Seconds = seconds;
            b.Milliseconds = milliseconds;
            return View("ProcessModelView",b);
        }


lo snippet sottostante serve ad evitare che si abbiano valori identici per i quali si potrebbero avere più chiavi che si riferiscono ad un solo elemento rendendo meno "realistico" il test :
string k = counter.ToString();
data = data + k.Substring(0,1);
int position = r.Next(0, 28000);
data = data.Remove(position, 1);     



il model :
public class ProcessModel
    {
        public ProcessModel()
        {

        }
         public double RamIniziale { get; set; }
        public double RamFinale { get;set; }

        public double DifferenzaRam {
            get { return (RamFinale - RamIniziale); }           
        }
        public int Seconds { get; set; }
        public double Milliseconds { get; set; }
    }



nella view :
@model CacheTester.Models.ProcessModel;
<span> differenza ram:  @Model.DifferenzaRam</span> <br />
<span>  iniziale ram:   @Model.RamIniziale</span><br />
<span>    finale ram:   @Model.RamFinale</span><br />
<span> numero millisecondi esecuzione: @Model.Milliseconds</span>

i risultati (forse anche un pò noiosi :-) ):


esecuzione in debug con 10000 elementi da 100 kb
differenza ram: 2882936832
iniziale ram: 69353472
finale ram: 2952290304
numero millisecondi esecuzione: 2634,2848

esecuzione in debug con 10000 elementi da 100 kb
differenza ram: 3179827200
iniziale ram: 69287936
finale ram: 3249115136
numero millisecondi esecuzione: 2205,4243

esecuzione in debug con 10000 elementi da 100 kb
differenza ram: 3251249152
iniziale ram: 69599232
finale ram: 3320848384
numero millisecondi esecuzione: 2013,1927


esecuzione in debug con 10000 elementi da 100 kb
differenza ram: 3065356288
iniziale ram: 69341184
finale ram: 3134697472
numero millisecondi esecuzione: 1983,0739

esecuzione in debug con 10000 elementi da 100 kb
differenza ram: 2885455872
iniziale ram: 69283840
finale ram: 2954739712
numero millisecondi esecuzione: 3337,625

esecuzione non in debug con 10000 elementi da 100kb
differenza ram: 3202289664
iniziale ram: 64741376
finale ram: 3267031040
numero millisecondi esecuzione: 1789,5347

esecuzione non in debug con 10000 elementi da 100kb
differenza ram: 2725826560
iniziale ram: 65175552
finale ram: 2791002112
numero millisecondi esecuzione: 1605,974

esecuzione non in debug con 10000 elementi da 100kb
differenza ram: 3238813696
iniziale ram: 64675840
finale ram: 3303489536
numero millisecondi esecuzione: 1955,8279

esecuzione non in debug con 10000 elementi da 100kb
differenza ram: 2988351488
iniziale ram: 65122304
finale ram: 3053473792
numero millisecondi esecuzione: 1940,5237

esecuzione non in debug con 10000 elementi da 100kb
differenza ram: 3047837696
iniziale ram: 64446464
finale ram: 3112284160
numero millisecondi esecuzione: 2379,3362

esecuzione in debug con 30000 elementi da 30kb:
differenza ram: 2058817536
iniziale ram: 68984832
finale ram: 2127802368
numero millisecondi esecuzione: 2496,5551

esecuzione in debug con 30000 elementi da 30kb:
differenza ram: 2188320768
iniziale ram: 69689344
finale ram: 2258010112
numero millisecondi esecuzione: 1966,4472

esecuzione in debug con 30000 elementi da 30kb:
differenza ram: 2067914752
iniziale ram: 69414912
finale ram: 2137329664
numero millisecondi esecuzione: 2425,9552

esecuzione non in debug con 30000 elementi da 30kb:
differenza ram: 2011680768
iniziale ram: 65171456
finale ram: 2076852224
numero millisecondi esecuzione: 2658,862

esecuzione non in debug con 30000 elementi da 30kb:
differenza ram: 2065113088
iniziale ram: 64823296
finale ram: 2129936384
numero millisecondi esecuzione: 1874,3063

esecuzione non in debug con 30000 elementi da 30kb:
differenza ram: 2311376896
iniziale ram: 64544768
finale ram: 2375921664
numero millisecondi esecuzione: 1937,1918

esecuzione non in debug con 30000 elementi da 30kb:
differenza ram: 2110238720
iniziale ram: 64536576
finale ram: 2174775296
numero millisecondi esecuzione: 2131,8403

esecuzione non in debug con 30000 elementi da 30kb:
differenza ram: 2058924032
iniziale ram: 64565248
finale ram: 2123489280
numero millisecondi esecuzione: 2072,0094


Altre proprietà dell'oggetto Process possono permettere di ricavare quali differenze comporta il caricamento degli oggetti riguardo a specifici aspetti della memoria ,queste sono : VirtualMemorySize64 , PagedMemorySize64, PagedSystemMemorySize64 ,NonpagedSystemMemorySize64

Il test è stato condotto all'interno di un'applicazione Asp .Net Core 2.2.

Nessun commento:

Crittografia e WCF per passare una password ( od una qualsiasi altra stringa (xml,json, etc.etc.) ) da un applicazione ad un' altra in sicurezza

 Il codice che segue è da considerarsi in alpha e da non utilizzare in un ambiente di produzione , qui potete trovare il  "progetto...