Domanda

Questa domanda ha già una risposta qui:

Come faresti per scoprire quanta memoria viene utilizzata da un oggetto?So che è possibile scoprire quanto viene utilizzato da un blocco di codice, ma non da un oggetto istanziato (in qualsiasi momento durante la sua vita), che è ciò che voglio.

È stato utile?

Soluzione

Non esiste un modo semplice per scoprire la dimensione della memoria di un oggetto Python.Uno dei problemi che potresti riscontrare è che gli oggetti Python, come liste e dict, potrebbero avere riferimenti ad altri oggetti Python (in questo caso, quale sarebbe la tua dimensione?La dimensione contiene la dimensione di ciascun oggetto oppure no?).Sono presenti alcuni puntatori generali e strutture interne relative ai tipi di oggetto e alla garbage collection.Infine, alcuni oggetti Python hanno comportamenti non ovvi.Ad esempio, gli elenchi riservano spazio per più oggetti di quanti ne abbiano, nella maggior parte dei casi;i dict sono ancora più complicati poiché possono operare in modi diversi (hanno un'implementazione diversa per un numero limitato di chiavi e talvolta allocano eccessivamente le voci).

C'è un grosso pezzo di codice (e un aggiornato grosso pezzo di codice) disponibili per cercare di approssimare al meglio la dimensione di un oggetto Python in memoria.

Potresti anche voler controllarne alcuni vecchia descrizione su PyObject (la struttura C interna che rappresenta praticamente tutti gli oggetti Python).

Altri suggerimenti

Prova questo:

sys.getsizeof(object)

getsizeof() chiama l'oggetto __sizeof__ metodo e aggiunge un ulteriore sovraccarico del Garbage Collector Se l'oggetto è gestito dal Garbage Collector.

Una ricetta ricorsiva

Un altro approccio consiste nell'utilizzare il sottaceto.Vedere questa risposta a un duplicato di questa domanda.

Non ho alcuna esperienza personale con nessuno dei seguenti, ma una semplice ricerca per un "profiler Python [memoria]" produce:

  • PySizer, "un profiler di memoria per Python", disponibile su http://pysizer.8325.org/.Tuttavia la pagina sembra indicare che il progetto non è stato aggiornato da un po', e fa riferimento a...

  • Heapy, "supporta il debug e l'ottimizzazione dei problemi relativi alla memoria nei programmi Python", disponibile su http://guppy-pe.sourceforge.net/#Heapy.

Spero che aiuti.

Questo deve essere usato con cautela perché una sostituzione sugli oggetti __sizeof__ potrebbe essere fuorviante.

Utilizzando bregman.suite, alcuni test con sys.getsizeof restituiscono una copia di un oggetto array (dati) in un'istanza dell'oggetto come più grande dell'oggetto stesso (mfcc).

>>> mfcc = MelFrequencyCepstrum(filepath, params)
>>> data = mfcc.X[:]
>>> sys.getsizeof(mfcc)
64
>>> sys.getsizeof(mfcc.X)
>>>80
>>> sys.getsizeof(data)
80
>>> mfcc
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>

Per oggetti di grandi dimensioni puoi utilizzare un metodo un po' rozzo ma efficace:controlla quanta memoria occupa il tuo processo Python nel sistema, quindi elimina l'oggetto e confronta.

Questo metodo presenta molti inconvenienti ma ti fornirà una stima molto rapida per oggetti molto grandi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top