algorithmes de gestion de la mémoire Python et de collecte des ordures à résoudre

Cet article présente les algorithmes de gestion de la mémoire et de collecte des ordures Python résolution, mis en place le mécanisme de collecte des ordures traditionnelles, ses méthodes de travail, les problèmes finaliseur et autres contenus connexes, a une certaine valeur de référence, les amis de besoin peuvent comprendre l'autre.
résumé

Existe dans la liste, tuples, les instances, les classes, le dictionnaire et les fonctions problème de référence circulaire. del exemples de la méthode seront traitées de manière sonore. Pour ajouter de nouveaux types de support GC est très facile. GC et soutenir le Python Python régulier est binaire compatible.

Generational travaux d'exécution de récupération (actuellement trois générations). Les résultats mesurés par le pybench est d'environ quatre pour cent les frais généraux. Pratiquement tous les modules d'extension devraient rester les mêmes correctement (je devais modifier la version standard du nouveau module cPickle). Gc d'un nouveau module appelé le débogueur peut être utilisé pour récupérer immédiatement et définir les options de débogage.

Collector devrait être portable sur toutes les plateformes. Python version du patch a passé tous les tests et retour à exécuter Graal, veille et croquis du temps sans aucun problème.

Depuis Python 2.0 et versions ultérieures, la collecte des ordures portable a été inclus dans lequel le. Collecte des ordures ménagères est activée par défaut. S'il vous plaît heureux certaines d'entre elles!

Pourquoi avons-nous besoin collecte des ordures?

La version actuelle de Python utilise le comptage de référence pour gérer l'allocation de mémoire. Chaque objet a un compte compte de référence Python, cette référence indique combien de pointer des objets à elle. Lorsque le nombre de référence est 0, l'objet est libéré. Nombre de références pour la plupart des programmes fonctionne bien. Cependant, le nombre de références sur une nature défectueuse, est due à la référence circulaire. L'exemple le plus simple d'une référence circulaire est une référence à l'objet lui-même. Par exemple:

>>> l = []
>>> l.append(l)
>>> del l

Cela a créé une liste de comptage de référence est maintenant 1. Cependant, étant donné qu'il est déjà inaccessible à partir de Python, et ne peut être utilisé à nouveau, et il doit être traité comme des ordures. Dans la version actuelle de Python, cette liste ne sera jamais publié.

Référence circulaire n'est pas une bonne pratique de la programmation en général, et éviter presque toujours. Cependant, il est parfois difficile d'éviter de créer une référence circulaire, ou le programmeur est même pas au courant du problème des références circulaires. Pour programme en cours d'exécution longue, comme un serveur, ce problème est particulièrement inquiétant. Les gens ne veulent pas que leurs serveurs ne peuvent pas être libérés en raison d'un objet de référence circulaire ne peut pas accéder à la mémoire étant épuisé. Pour les grands programmes, comment difficile de trouver une référence circulaire est créé.

collecte des ordures « traditionnelle » est quoi?

la collecte des ordures traditionnel (tel que le marquage - méthode de balayage ou arrêts - Copie Method) est généralement suit que:

Trouver le système d'objet racine. L'objet racine est comme un environnement global (comme python dans le principal module) et de l' objet sur la pile.
Rechercher tous les objets qui peuvent être accessibles à partir de ces objets. Ces objets sont « actifs ».
La libération de tous les autres objets.
Malheureusement, cette méthode ne peut pas être utilisé pour la version actuelle de Python. Étant donné que les modules de travail d'expansion, Python détermine pas complètement l'ensemble racine d'objets. Si l'ensemble racine d'objets ne peut pas être déterminée avec précision, nous avons encore le risque de la libération de l'objet référencé. Conçu pour que l'utilisation d'autres module d'extension, il n'y a aucun moyen de trouver l'objet portable sur la pile du courant C. De plus, le nombre de références a fourni quelques programmeurs Python déjà hâte à la localité de références de mémoire sur les avantages et la sémantique de terminaison. Le mieux que nous pouvons trouver un compte de référence qui est capable d'utiliser, mais peut également libérer schéma de références circulaires.

Comment fonctionne cette méthode?

Conceptuellement, cette méthode et le mécanisme de collecte des ordures traditionnel situé en face. Cette méthode tente de trouver tous les objets inaccessibles, plutôt que d'aller tous les objets accessibles. Il est beaucoup plus sûr, parce que si cette méthode échoue, au moins pas sans que la collecte des ordures pire (sans tenir compte de perdre notre temps et de l'espace).

Parce que nous sommes toujours avec un éboueur de comptage de référence seulement besoin de trouver des références circulaires. Nombre de références traitera d'autres types de déchets. Tout d'abord, nous avons observé que la référence circulaire ne peut être de créer un objet conteneur. objet conteneur est un objet qui peut contenir d'autres objets référencés. En Python, listes, dictionnaires, des instances, des classes et des exemples sont l'objet conteneur ancestral. Entier et chaîne n'est pas un conteneur. Avec cette découverte, nous avons réalisé que l'objet non-conteneur peut être ignoré déchets recyclés. Ceci est une optimisation utile comme les entiers et les chaînes devraient être relativement faible.

Maintenant, l'idée est d'enregistrer tous les objets conteneurs. Il y a plusieurs façons de le faire, cependant, la meilleure façon est d'utiliser une liste doublement chaînée, la liste liée à la structure de l'objet comprend un champ de pointeur. Ainsi, vous pouvez insérer rapidement les objets retirés de la collection, et ne nécessite l'allocation de mémoire supplémentaire. Lorsqu'un conteneur est créé, il est inséré dans cette collection, est supprimé, il est retiré de la collection.

Maintenant que nous pouvons obtenir tout l'objet conteneur, comment pouvons-nous trouver des références circulaires? Tout d'abord nous ajoutons un autre champ à deux pointeurs objet conteneur extérieur. Nous avons appelé ce gc_refs sur le terrain. Nous pouvons trouver une référence circulaire dans les étapes suivantes:

Chaque objet conteneur, la valeur de comptage de référence fourni objet de gc_refs.
Chaque objet conteneur, pour trouver un autre contenant des objets références et il les valeurs de celle - ci gc_refs moins un.
Tout objet conteneur gc_refs est supérieur à un objet référencé par la collection d'objets à l'extérieur du récipient. Nous ne pouvons pas libérer ces objets, nous avons donc mis ces objets dans une autre collection.
L'objet est supprimé ne peut pas être libéré l'objet référencé. Nous les mettons et leur donner accès aux objets sont retirés de la collection actuelle.
Dans la collection actuelle des objets restants ne sont référencés par les objets de la collection (qui est, ils ne peuvent pas être pris en Python, ce qui est des déchets). Nous pouvons maintenant de libérer ces objets.
problème finaliseur

Notre grand plan il y a un problème, le problème est d'utiliser un finaliseur. La méthode de l'exemple Finalizer __del__ en Python. Lorsque vous utilisez un compte de référence, Finalizer à bien. Lorsque le compteur de référence d'un objet tombe à zéro lorsque le, Finalizer sorti juste avant l'objet est appelé. Pour les programmeurs, cela est simple et facile à comprendre.

Lorsque la collecte des ordures, appelez le finaliseur est devenu un problème gênant, surtout lorsqu'ils sont confrontés au problème des références circulaires. Si deux objets dans une référence circulaire a finaliseur, comment faire? Que le premier appel? Après avoir appelé la première finaliseur, les objets ne peuvent pas être libérés parce que le second peut finaliseur y accéder.

Parce qu'il n'y a pas de bonne solution à ce problème, l'objet référencé a un cycle de finaliseur ne peut pas être libéré. Au lieu de cela, ces objets sont ajoutés à une liste globale des ordures ne peuvent pas être recyclés. Les programmes doivent toujours être réécrite pour éviter ce problème. En dernier recours, le programme peut lire cette liste globale et libérer ces références dans une boucle pour l'application en cours d'une manière significative.

À quel prix?

Comme certaines personnes disent, il n'y a pas de repas gratuit sous le soleil. Cependant, cette forme de collecte des ordures est relativement peu coûteux. L'un des plus gros coût pour chaque objet conteneur ont besoin d'espace mémoire supplémentaire de trois mots. Il y a l'entretien collection de conteneurs de frais généraux. La version actuelle du garbage collector, le coût est probablement basé sur ce pybench taux de baisse de quatre pour cent.

Le courant garbage collector record de trois générations d'objets d'information. En ajustant les paramètres, le temps passé dans la collecte des ordures peut penser combien il est petit comment petit. Pour certaines applications, éteignez la collecte des ordures automatique et d'exécution appel explicite peut être important. Cependant, les paramètres de collecte des ordures par défaut exécuter pybench, le temps de collecte des ordures ne semble pas passé grand. De toute évidence, un grand nombre d'applications de distribution d'objets de conteneur peut causer plus de temps de collecte des ordures.

Le patch en cours ajoute une nouvelle clé de configuration pour activer le garbage collector. Il y a garbage collector avec le standard de Python Python est binaire compatible. Si cette option est désactivée, le travail de l'interpréteur Python serait pas d'impact.

Comment puis-je utiliser?

Il suffit de télécharger la version actuelle de Python sur elle. Le garbage collector a été inclus dans une version future 2.0, et la valeur par défaut est activé par défaut. Si vous utilisez Python 1.5.2 la version, il y a peut-être une ancienne version de travail de patch. Si vous utilisez une plate-forme Windows, vous pouvez télécharger un python15.dll à remplacer.

Boehm-Demers collecte des ordures conservateur

Ce patch ajoute quelques modifications à Python 1.5.2, en utilisant une poubelle conservatrice collecteur Boehm-Demers. Mais vous devez frapper ce patch. utilise encore le comptage de référence. Le ramasse-miettes libère seulement la mémoire de comptage de référence est non clarifiés (à savoir, des références circulaires). Cela devrait être la meilleure performance. Vous avez besoin:

$ cd Python-1.5.2
$ patch -p1 < ../gc-malloc-cleanup.diff
$ patch -p1 < ../gc-boehm.diff
$ autoconf
$ ./configure --with-gc

Supposons que vous installez ce patch libgc.a, rendant les options de lien -lgc sont disponibles (/ usr / lib local / devrait être). Si vous ne disposez pas de cette bibliothèque avant de compiler télécharger et installer.

À l'heure actuelle, ce patch a été testé sur Linux. Peut-être aussi travailler sur d'autres machines Unix. Sur ma machine Linux, la version GC de Python passe tous les tests de régression.

Je vous écris, pour tout le monde de recommander un très large rassemblement de ressources d'apprentissage python, cliquez pour entrer , il y a un programmeur senior avant d' apprendre à partager des expériences, des notes d'étude, il y a une chance d'expérience en affaires, et pour tout le monde d'organiser soigneusement un zéro python la base des données réelles du projet, python quotidien pour vous sur les dernières technologies, les perspectives d' apprentissage, les petits détails doivent laisser un message
sommaire

C'est tout pour cet article sur la gestion de la mémoire Python et des algorithmes de collecte des ordures résolus

Publié 43 articles originaux · louange gagné 13 · vues + 50000

Je suppose que tu aimes

Origine blog.csdn.net/haoxun11/article/details/105057229
conseillé
Classement