519 votes

Comment peux j’ai explicitement mémoire libre en Python ?

J'ai écrit un programme en Python qui agit sur un grand fichier d'entrée pour créer quelques millions d'objets représentant des triangles. L'algorithme est:

  1. lire un fichier d'entrée
  2. traiter le fichier et créer une liste de triangles, représentés par leurs sommets
  3. sortie des sommets dans le format: une liste de sommets, suivi par une liste de triangles. Les triangles sont représentés par des indices dans la liste des sommets

L'exigence de l'ARRÊT que j'ai imprimer la liste complète des sommets avant de je imprimer les triangles signifie que je dois tenir la liste des triangles dans la mémoire avant d'écrire la sortie vers un fichier. En attendant, je suis l'obtention de la mémoire des erreurs en raison de la taille des listes.

Quelle est la meilleure façon de dire à Python que je n'ai plus besoin de certaines données, et il peut être libéré?

646voto

Havenard Points 9023

Conformément à la Documentation officielle de Python, vous pouvez forcer le Garbage Collector puisse libérer la mémoire non référencée avec``

126voto

Alex Martelli Points 330805

Malheureusement (selon votre version et la version de Python) certains types d'objets à utiliser "les listes libres" qui sont un pur référencement local, mais peuvent provoquer une fragmentation de la mémoire, en particulier en rendant de plus en plus de mémoire "affectés" pour uniquement les objets d'un certain type et donc indisponible pour le "fonds général".

Le seul vraiment moyen fiable de s'assurer qu'une grande mais l'utilisation temporaire de la mémoire NE se renvoyer toutes les ressources du système quand c'est fait, c'est d'avoir cette utilisation se produire dans un sous-processus, ce qui ne l'exigeantes en mémoire de travail se termine. Dans de telles conditions, le système d'exploitation VA faire son travail, et un plaisir de les recycler toutes les ressources du sous-processus peuvent avoir avalé vers le haut. Heureusement, l' multiprocessing module fait ce genre d'opération (qui sert à être plutôt une douleur), pas trop mal dans les versions modernes de Python.

Dans votre cas, il semble que le meilleur moyen pour le sous-processus d'accumuler des résultats et encore de s'assurer que ces résultats sont à la disposition des principaux processus est d'utiliser des semi-fichiers temporaires (par semi-temporaire, je veux dire, PAS le genre de fichiers automatiquement aller loin quand il est fermé, tout à fait ordinaire fichiers que vous supprimez de façon explicite lorsque vous avez terminé avec eux).

63voto

Aiden Bell Points 19856

L' del déclaration pourrait être utile, mais autant que je me souvienne , il n'est pas garanti pour libérer de la mémoire. Les docs sont ici ... et pourquoi il n'est pas publié est ici.

J'ai entendu des gens sur Linux et les systèmes de type Unix bifurquer un python processus de travail, obtenir des résultats, puis de le tuer.

Cet article présente des notes sur le Python garbage collector, mais je pense que le manque de contrôle de mémoire est l'inconvénient de la gestion de la mémoire

40voto

Ned Batchelder Points 128913

Python est nettoyé, afin que si vous réduisez la taille de votre liste, il va récupérer la mémoire. Vous pouvez également utiliser l’instruction « del » pour se débarrasser complètement d’une variable :

25voto

Lennart Regebro Points 52510

Vous ne pouvez pas explicitement libérer de la mémoire. Ce que vous devez faire est de vous assurer que vous ne gardez pas les références à des objets. Ils seront ensuite nettoyés, libérer la mémoire.

Dans votre cas, lorsque vous avez besoin de listes, il est en général nécessaire de réorganiser le code, généralement à l'aide de générateurs/itérateurs à la place. De cette façon, vous n'avez pas besoin d'avoir les grandes listes en mémoire à tous.

http://www.prasannatech.net/2009/07/introduction-python-generators.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X