Python Language Gestion de la récupération de place


Exemple

Il existe deux approches pour influencer le nettoyage de la mémoire. Ils influencent la fréquence à laquelle le processus automatique est exécuté et l'autre déclenche manuellement un nettoyage.

Le garbage collector peut être manipulé en réglant les seuils de collecte qui affectent la fréquence d'exécution du collecteur. Python utilise un système de gestion de la mémoire basé sur la génération. Les nouveaux objets sont enregistrés dans la génération la plus récente - generation0 et avec chaque collection survivante, les objets sont promus aux générations plus anciennes. Après avoir atteint la dernière génération - la génération 2 , ils ne sont plus promus.

Les seuils peuvent être modifiés à l'aide de l'extrait suivant:

import gc
gc.set_threshold(1000, 100, 10) # Values are just for demonstration purpose

Le premier argument représente le seuil de collecte de génération0 . Chaque fois que le nombre d' allocations dépasse le nombre de désallocations de 1 000, le récupérateur de mémoire sera appelé.

Les générations les plus anciennes ne sont pas nettoyées à chaque exécution pour optimiser le processus. Les deuxième et troisième arguments sont facultatifs et contrôlent la fréquence de nettoyage des générations les plus anciennes. Si generation0 a été traité 100 fois sans nettoyage de la génération 1 , alors la génération 1 sera traitée. De même, les objets de génération 2 ne seront traités que lorsque ceux de génération 1 ont été nettoyés 10 fois sans toucher à la génération 2 .

Un exemple dans lequel la définition manuelle des seuils est bénéfique est lorsque le programme alloue un grand nombre de petits objets sans les désallouer, ce qui entraîne l'exécution trop fréquente du ramasse-miettes (chaque attribution d'objet generation0_threshold ). Bien que le collecteur soit assez rapide, lorsqu'il fonctionne sur un grand nombre d'objets, il pose un problème de performance. Quoi qu'il en soit, il n'y a pas de stratégie unique pour choisir les seuils et son utilisation est fiable.

Le déclenchement manuel d'une collection peut se faire comme dans l'extrait de code suivant:

import gc
gc.collect()

La récupération de place est automatiquement déclenchée en fonction du nombre d'allocations et de désallocations, et non de la mémoire consommée ou disponible. Par conséquent, lorsque vous travaillez avec des objets volumineux, la mémoire peut être épuisée avant le déclenchement du nettoyage automatisé. Cela fait un bon cas d'utilisation pour appeler manuellement le garbage collector.

Même si c'est possible, ce n'est pas une pratique encouragée. Eviter les fuites de mémoire est la meilleure option. Quoi qu'il en soit, dans les grands projets, la détection de la fuite de mémoire peut être une tâche ardue et le déclenchement manuel d'une récupération de place peut être utilisé comme solution rapide jusqu'au débogage ultérieur.

Pour les programmes de longue durée, le nettoyage de la mémoire peut être déclenché sur une base ponctuelle ou par événement. Un exemple pour le premier est un serveur Web qui déclenche une collecte après un nombre fixe de requêtes. Par la suite, un serveur Web qui déclenche un nettoyage de la mémoire lorsqu'un certain type de demande est reçu.