La Force de collecte des ordures en Python pour libérer de la mémoire
J'ai un Python2.7 Application qui utilise beaucoup de dict
objets dont la plupart contiennent des chaînes de caractères pour les clés et les valeurs.
Parfois ces dicts et les chaînes de caractères ne sont plus nécessaires et je voudrais enlever ceux de la mémoire.
J'ai essayé différentes choses, del dict[key]
, del dict
, etc. Mais l'Application utilise toujours la même quantité de mémoire.
Ci-dessous un exemple de ce à quoi je m'attends à des frais de la mémoire. Mais il n'a pas 🙁
import gc
import resource
def mem():
print('Memory usage : % 2.2f MB' % round(
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024.0/1024.0,1)
)
mem()
print('...creating list of dicts...')
n = 10000
l = []
for i in xrange(n):
a = 1000*'a'
b = 1000*'b'
l.append({ 'a' : a, 'b' : b })
mem()
print('...deleting list items...')
for i in xrange(n):
l.pop(0)
mem()
print('GC collected objects : %d' % gc.collect())
mem()
De sortie:
Memory usage : 4.30 MB
...creating list of dicts...
Memory usage : 36.70 MB
...deleting list items...
Memory usage : 36.70 MB
GC collected objects : 0
Memory usage : 36.70 MB
Je m'attends ici certains objets à "collectées" et de la mémoire pour être libéré.
Je fais quelque chose de mal? Toutes les autres manières de supprimer des objets inutilisés, ou au moins de trouver l'endroit où les objets sont de façon inattendue utilisé.
- alors ne
gc.collect()
Vous devez vous connecter pour publier un commentaire.
Frédéric Lundh explique,
et Alex Martelli écrit:
Ainsi, vous pouvez utiliser
multiprocessing
pour frayer un sous-processus, procédez de la mémoire-monopolisant calcul, puis vérifiez que la mémoire est libérée lorsque le sous-processus se termine:rendements
Mem usage...
devraient donner plus de mémoire, vous ne pensez pas?getrusage
rapporte le maximum de résident de définir la taille en kilo-octets, et non d'octets.