Ho bisogno di sapere quanti byte il mio oggetto consuma in memoria (in C#). per esempio quanto il mio Hashtable
o SortedList
o List<String>
.Come ottenere la dimensione dell'oggetto in memoria?
risposta
oggetto non gestito:
Marshal.SizeOf(object yourObj);
Tipi di valore:
sizeof(object val)
oggetto gestito:
- Sembra che non v'è alcun modo diretto per ottenere per oggetti gestiti, Rif: http://blogs.msdn.com/cbrumme/archive/2003/04/15/51326.aspx
non credo che si può ottenere direttamente, ma ci sono alcuni modi per trovare indirettamente.
Un modo è utilizzare il metodo GC.GetTotalMemory
per misurare la quantità di memoria utilizzata prima e dopo aver creato l'oggetto. Questo non sarà perfetto, ma finché controlli il resto dell'applicazione potresti ottenere le informazioni che ti interessano.
A parte questo puoi usare un profiler per ottenere le informazioni oppure puoi usare il profiling api per ottenere le informazioni nel codice. Ma non sarà facile da usare, penso.
Vedere Find out how much memory is being used by an object in C#? per una domanda simile.
+1 è stato abbastanza buono per me! –
Mentre la "vera" risposta potrebbe essere "non si può fare", la risposta migliore è quella che ti offre un'alternativa possibile. –
Questo ha funzionato bene per me. Nel mio caso stavo lavorando con un oggetto molto complesso che non poteva essere serializzato facilmente, quindi i top an erano fuori questione. Ho usato questo metodo con un ciclo for per ottenere una media approssimativa in ogni punto. Mi ha aiutato a vedere la differenza tra quando questa entità non esisteva e poi ha funzionato. Delta == dimensione approssimativa dell'entità. – user2326106
In modalità debug
carico SOS
ed eseguire il comando dumpheap.
sembra qualcosa da windbg, e potrebbe essere davvero utile. Puoi elaborare come farlo in Visual Studio? –
long size = 0;
object o = new object();
using (Stream s = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(s, o);
size = s.Length;
}
Il seguente frammento di codice dovrebbe restituire la dimensione in byte di qualsiasi oggetto passato ad esso, purché possa essere serializzata. L'ho ottenuto da un collega di Quixant per risolvere un problema di scrittura su SRAM su una piattaforma di gioco. Spero che aiuti. Credito e grazie a Carlo Vittuci.
/// <summary>
/// Calculates the lenght in bytes of an object
/// and returns the size
/// </summary>
/// <param name="TestObject"></param>
/// <returns></returns>
private int GetObjectSize(object TestObject)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
byte[] Array;
bf.Serialize(ms, TestObject);
Array = ms.ToArray();
return Array.Length;
}
Non ha funzionato per me. Non avevo la classe dell'oggetto definita come serializzabile e lanciava un messaggio "Non contrassegnato come errore serializzabile" – dreamerkumar
Ciao @Kevin Hirst, ho provato con questo che ha analizzato il mio set di dati per ottenere la dimensione in byte. Mi restituisce l'eccezione di memoria esaurita. Scoprirò che la dimensione massima dei byte è 2 GB? Hai qualche idea su come gestirlo? – Worgon
@ Worgon, hai davvero bisogno di sapere quanto è grande il set di dati tranne che per scopi di indagine? Preferirei pensare a un livello, per eliminare una tale necessità. Se insisti, potresti pensare a una particolare dimensione di Datarow o usare l'approccio di "GC.GetTotalMemory" sopra menzionato. –
OK, questa domanda è stato risposto e risposta accettata, ma qualcuno mi ha chiesto di mettere la mia risposta quindi non ci si va.
Prima di tutto, non è possibile dirlo con certezza. Si tratta di un dettaglio di implementazione interno e non documentato. Tuttavia, in base agli oggetti inclusi nell'altro oggetto. Ora, come calcoliamo il requisito di memoria per i nostri oggetti memorizzati nella cache?
avevo toccato in precedenza questo argomento in questo article:
Ora, come si fa a calcolare il requisito di memoria per i nostri cache oggetti?Bene, come molti di voi saprebbero, Int32 e float sono quattro byte , double e DateTime 8 byte, char in realtà due byte (non un byte) e così via. La stringa è un po 'più complessa, 2 * (n + 1), dove n è la lunghezza della stringa. Per gli oggetti, dipenderà dai membri : basta sommare il requisito di memoria di tutti i suoi membri, ricordando tutti i riferimenti oggetto sono semplicemente 4 byte puntatori su una casella 32 bit. Ora, questo in realtà non è del tutto vero, non ci siamo presi cura dello del sovraccarico di ogni oggetto nell'heap. Non sono sicuro che sia necessario il preoccuparsi di ciò, ma suppongo che se si utilizzeranno lotti di piccoli oggetti, si dovrebbe prendere in considerazione l'overhead in . Ogni oggetto heap costa tanto quanto i suoi tipi primitivi, più quattro byte per i riferimenti oggetto (su una macchina a 32 bit, sebbene BizTalk esegua anche 32 bit su macchine a 64 bit), più 4 byte per il puntatore dell'oggetto tipo e Penso 4 byte per l'indice del blocco di sincronizzazione. Perché è questo overhead aggiuntivo importante? Bene, immaginiamo di avere una classe con due membri di Int32; in questo caso, il requisito di memoria è 16 byte e non 8.
penso che questo dovrebbe essere contrassegnato come risposta. che dice usa il tuo cervello invece del computer! ;) –
Questo non risponde alla domanda dell'OP, come dovremmo misurare la dimensione di un HashSet contro un elenco? –
- 1. Come ottenere la dimensione della memoria di sistema disponibile?
- 2. Come ottenere la dimensione della memoria della variabile?
- 3. allocazione memoria e dimensione 0: posso ottenere perdite di memoria?
- 4. Come trovare la dimensione della memoria virtuale e la dimensione della cache di un sistema Linux?
- 5. Come ottenere la dimensione (KB) di UIImage
- 6. Come ottenere la dimensione dell'oggetto gioco principale?
- 7. Come ottenere la dimensione del database mysql?
- 8. Come ottenere la dimensione di un JPopupMenu?
- 9. Come ottenere la dimensione del file
- 10. HTML5 - come ottenere la dimensione dell'immagine
- 11. Come ottenere la dimensione visibile su un'attività?
- 12. Come ottenere la dimensione corretta di UITableViewCell?
- 13. Ottenere la dimensione del file in Haskell
- 14. come ottenere la dimensione dell'heap di un programma
- 15. python. ottenere la dimensione di un oggetto
- 16. Come ottenere la dimensione di memoria html5 totale utilizzata dall'applicazione corrente
- 17. Come posso ottenere la dimensione della memoria allocata dal mio programma?
- 18. php come ottenere la dimensione dell'immagine web in kb?
- 19. Come ottenere la dimensione di un intervallo in Excel
- 20. Come ottenere la dimensione di un componente in nativo reattivo?
- 21. Come ottenere/rilevare la dimensione dello schermo in Xamarin.Forms?
- 22. come ottenere la dimensione della riga mysql in GB
- 23. Come ottenere la dimensione del file immagine in Swift?
- 24. Come ottenere la dimensione in byte della richiesta?
- 25. Come ottenere la dimensione del file in WinRT?
- 26. Come ottenere la dimensione del carattere in HTML
- 27. Come ottenere la dimensione originale di un'immagine in scala
- 28. Come ottenere la dimensione dell'elenco di array in java jsp?
- 29. Come ottenere la dimensione della stringa in byte?
- 30. Come ottenere la dimensione del cursore in C#
E http://stackoverflow.com/questions/207592/getting-the-size-of-a-field-in-bytes-with -c –
Io secondo, chiudendo questo e cerco risposte già date. Entrambi suggeriti da Jon sono validi. –
terzo, ma offensivo? – annakata