Calcolare la ram occupata da dei file-oggetti?

di il
2 risposte

Calcolare la ram occupata da dei file-oggetti?

Ciao a tutti ,vorrei calcolare quanto spazio occupano dei file o degli oggetti salvati in cache ram,ho scritto uno snippet ma vorrei un opinione sul fatto di avere impostato correttamente il codice ,

        private IMemoryCache _cache;
        public HomeController(IMemoryCache memoryCache)
        {
            _cache = memoryCache;
            ViewData["FileName"] = "test";
        }
..................
.................
.................
Process p = Process.GetCurrentProcess();
            long memoriaNonPaginata = p.NonpagedSystemMemorySize64;
            long memoriaPaginata = p.PagedMemorySize64;
            long memoriaDiSistema = p.PagedSystemMemorySize64;
            long ramIniziale = memoriaNonPaginata + memoriaPaginata + memoriaDiSistema;
            BasicModel b = new BasicModel();            
            b.RamIniziale = ramIniziale;
            MemoryCacheEntryOptions opt = new MemoryCacheEntryOptions();
            opt.Priority = CacheItemPriority.NeverRemove;
            string data = null;
            string path = @"C:\Users\test\Desktop\SourceCode.txt";
            data = System.IO.File.ReadAllText(path);                
            int numeroOggettiInCache = 33000;
            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 memoriaNonPaginataPost = p1.NonpagedSystemMemorySize64;
            long memoriaPaginataPost = p1.PagedMemorySize64;
            long memoriaDiSistemaPost = p1.PagedSystemMemorySize64;
            long ramFinale = memoriaNonPaginataPost + memoriaPaginataPost + memoriaDiSistemaPost;
            b.RamFinale = ramFinale;            
            string a1=  _cache.Get("cucu1").ToString();
            string a2 = _cache.Get("cucu907").ToString();
            string a3 = _cache.Get("cucu29907").ToString();
            return View("BasicModelView",b);
questo serve a modificare il file che viene caricato n volte ,pensavo che se uguale o quasi venisse salvato solo una volta

string k = counter.ToString();
                data = data + k.Substring(0,1);
                int position = r.Next(0, 28000);
                data = data.Remove(position, 1);

public class BasicModel
    {
        double differenzaRam;
        public BasicModel()
        {

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

        public double DifferenzaRam {
            get { return (RamFinale - RamIniziale); }
            set { differenzaRam = value; }
        }
    }
spero nei vostri suggerimenti o dove trovare info relative all'argomento,grazie,ciao

2 Risposte

  • Re: Calcolare la ram occupata da dei file-oggetti?

    E" abbastanza complicato sapere la dimensione di un oggetto:

    per certi tipi di oggetti e' relativamente semplice (char/short/int/float/double/ strutture di oggetti semplici/strutture di strutture di oggetti semplici/.../puntatori/vettori di oggetti semplici/...)

    per le classi (le STRUCT con metodi SONO CLASSI) e' abbastanza piu' complicato perche' bisogna considerare the strutture di servizio gestite dal compilatore come le informazioni sulla lunghezza del vettore, la tabella dei metodi virtuali, l'ereditarieta', ...

    Il modo per avere una STIMA della dimensione e' quella di allocare 1000/10.000 o 100.000 oggetti nello heap, conoscere la dimensione dello HEAP DOPO l'allocazione, rilasciare TUTTI gli oggetti allocati e richedere la dimensione dello HEAP DOPO la deallocazione
    MA lo devi fare diverse volte perche' il gestore della memoria potrebbe, AUTOMATICAMENTE rilasciare la memoria se si accorge che non e' piu' necessaria.

    Poi bisogna considerare che l'allocazione non alloca il numero ESATTO di byte richiesti dalla struttura ma una quantita' di meoria SUFFICIENTE per contenere la struttura MA MULTIPLO di una quantita' minima (di solito 8 o 16 byte, MA dipende dal compilatore, dalla CPU, dal gestore della memoria, ecc ...)

    POI bisogna considerare che la CACHE, per SUA NATURA, ogni tanto elimina degli oggetti PROPRIO per far spazio ai nuovi oggetti (altrimenti sarebbe una cache abbastaza "stupidina") e le logiche di rimozione possono essere anche abbastanza complicate (l'oggetto piu' veccho, quello piu' grosso, quelli piu' numerosi, ...)

    Insomma: E' COMPLICATO

    Ovviamente c'e' modo di saperlo, MA consiste nell'agganciare delle DLL scritte in C DIRETTAMENTE alla virtual machine .NET.
    Ad esempio questo tipo di operazioni lo fanno i "memory profiler".

    Per arrivare a questo livello bisogna essere dei piu' che buoni programmatori e STUDIARE le API messe a disposizione dalla VM.
  • Re: Calcolare la ram occupata da dei file-oggetti?

    Ciao migliorabile,grazie per la risposta,Buon Anno,
Devi accedere o registrarti per scrivere nel forum
2 risposte