Je me bats contre une fuite de mémoire dans un projet Python et y passais déjà beaucoup de temps. J'ai déduit le problème à un petit exemple. Maintenant, semble que je connais la solution, mais je ne peux pas comprendre pourquoi.Pourquoi l'affectation de tranches de liste python consomme de la mémoire?
import random
def main():
d = {}
used_keys = []
n = 0
while True:
# choose a key unique enough among used previously
key = random.randint(0, 2 ** 60)
d[key] = 1234 # the value doesn't matter
used_keys.append(key)
n += 1
if n % 1000 == 0:
# clean up every 1000 iterations
print 'thousand'
for key in used_keys:
del d[key]
used_keys[:] = []
#used_keys = []
if __name__ == '__main__':
main()
L'idée est que je stocke des valeurs dans le dict d
et de mémoriser les clés utilisées dans une liste pour pouvoir nettoyer le dict de temps en temps.
Cette variante du programme mange avec confiance de la mémoire ne jamais le renvoyer. Si j'utilise une méthode alternative pour "effacer" used_keys
qui est commentée dans l'exemple, tout va bien: la consommation de mémoire reste à un niveau constant.
Pourquoi?
Testé sur CPython et de nombreux linux.
Comment savez-vous avec certitude qu'il ne le retourne jamais? Il se peut que le système d'exploitation ne le demande jamais. – detly
Ne devrait-il pas effacer 'used_keys' en dehors de la boucle' for key in used_keys'? – adamk
> L'idée est que je stocke certaines valeurs dans la dictée et mémorise les clés utilisées dans une liste pour pouvoir nettoyer la dict de temps en temps. Pourquoi ne pas utiliser 'd.keys()'? Ce sera la même liste de clés. –