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()
InformationsquelleAutor ddofborg | 2015-08-23