Question Est-ce que le réglage de numpy se fait sur Aucun mémoire libre?


J'ai des centaines de matrices vraiment grandes, comme (600, 800) ou (3, 600, 800).

Par conséquent, je veux désallouer la mémoire utilisée dès que je n’ai plus besoin de quelque chose.

J'ai pensé:

some_matrix = None

Devrait faire le travail, ou est-ce que la référence est définie sur None mais quelque part dans la mémoire, l'espace encore alloué? (comme la conservation de l’espace alloué pour une réinitialisation de some_matrix A l'avenir)

De plus: parfois, je découpe les matrices, calcule quelque chose et place les valeurs dans un tampon (une liste, car elle est ajoutée tout le temps). Donc, définir une liste sur Aucun va certainement libérer la mémoire, non?

Ou fait une sorte de unset() méthode existe où les identificateurs entiers et ses objets référencés sont "supprimés"?


11
2018-02-10 13:34


origine


Réponses:


Vous voulez certainement regarder le collecte des ordures. Contrairement à certains langages de programmation comme C/C++ Lorsque le programmeur doit libérer de la mémoire allouée dynamiquement lorsque l'espace n'est plus nécessaire, python dispose d'une récupération de place. Ce qui signifie que python lui-même libère la mémoire quand necessary.

Lorsque vous utilisez some_matrix = None, vous dissociez la variable de l'espace mémoire; le compteur de référence est diminué et s'il atteint 0, le ramasse-miettes va libérer la mémoire. Lorsque vous utilisez del some_matrix comme suggéré par MSeifert, la mémoire n'est pas libérée immédiatement contrairement à ce que dit la réponse. Selon doc python, c'est ce qui arrive:

La suppression d'un nom supprime la liaison de ce nom de l'espace de noms local ou global

Ce qui s'est passé sous le capot, c'est que le compteur de références à l'espace mémoire est réduit de 1 indépendamment de l'attribution None ou en utilisant del. Lorsque ce compteur atteint 0, le ramasse-miettes va free l'espace mémoire dans le futur. La seule différence est que lors de l'utilisation del, il est clair du contexte que vous n'avez plus besoin du nom.

Si vous regardez la documentation de la récupération de mémoire, vous verrez que vous pouvez l'invoquer vous-même ou modifier certains de ses paramètres.


12
2018-02-10 14:01



Numpy supprime les tableaux lorsque le compteur de référence est à zéro (ou au moins garde la trace du compteur de référence et laisse le système d'exploitation récupérer les déchets).

Par exemple avoir

import numpy as np
a = np.linspace(0,100, 10000000)
a = None

va libérer la mémoire "immédiatement" (la manière préférée est d'écrire del a bien que)

import numpy as np
a = np.linspace(0,100, 10000000)
b = a
a = None

ne libérera rien.


Vous avez également mentionné le tranchage. Le découpage est juste une vue sur les données et donc exactement comme le deuxième exemple. Si vous ne supprimez pas les deux variables faisant référence au même tableau, le système d'exploitation conservera les tableaux.

Si je fais quelque chose de très coûteux en mémoire, je m'en tiendrai toujours à des fonctions distinctes qui font l'opération et ne renvoient que ce qui est vraiment nécessaire. Les fonctions se nettoient après elles pour que tous les résultats intermédiaires soient libérés (s'ils ne sont pas retournés).


5
2018-02-10 13:45