2015-08-10 13 views
5

Ho un codice Python in cui gc.collect() sembra liberare molta memoria. Data la natura di conteggio dei riferimenti di Python, sono propenso a pensare che il mio programma contenga molti riferimenti ciclici. Poiché alcune strutture di dati sono piuttosto grandi, vorrei introdurre riferimenti deboli. Ora ho bisogno di trovare i riferimenti circolari, avendo trovato alcuni di quelli ovvi, Mi chiedo se uno può rilevare riferimenti circolari e gli oggetti che formano l'anello esplicitamente. Finora ho visto solo tutorial su come chiamare gc.collect et. al.Come scoprire quali riferimenti circolari specifici sono presenti nel codice

+0

Questi oggetti hanno metodi '__del__' personalizzati? – Cyphase

+0

È possibile trovare utile il pacchetto [objgraph] (http://mg.pov.lt/objgraph/). Creerà una visualizzazione dei riferimenti tra gli oggetti. [Ecco un post sul blog su riferimenti circolari e objgraph.] (Http://engineering.hearsaysocial.com/2013/06/16/circular-references-in-python/) – Cyphase

+0

Mi limiterò anche a menzionare che idealmente, si dovrebbe rimuovere questi riferimenti circolari in primo luogo, se possibile, piuttosto che cercare di aggirarli :). – Cyphase

risposta

0

A meno che non si stia eseguendo l'override dei metodi __del__, non ci si deve preoccupare delle dipendenze circolari, poiché Python è in grado di gestirle correttamente.

+0

... fino a quando non si tenta di utilizzare la multiprocessing di Python e gli oggetti non si accartocciano più . IMO è una buona idea pensare a come evitare i riferimenti ciclici durante la progettazione di un'applicazione, perché mantiene aperte diverse porte per ottimizzare le prestazioni in un secondo momento. Questo * non * è lo stesso dell'ottimizzazione prematura. –

Problemi correlati