Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Python

Dépannage des fuites de mémoire Python : diagnostiquer et résoudre les problèmes de performances

Les fuites de mémoire se produisent lorsqu'un programme gère de manière incorrecte les allocations de mémoire, ce qui entraîne une réduction de la mémoire disponible et potentiellement un ralentissement ou un crash du programme.

En Python, la gestion de la mémoire est généralement gérée par l'interpréteur mais des fuites de mémoire cela peut encore se produire, en particulier dans les applications de longue durée. Diagnostiquer et réparer les fuites de mémoire en Python implique de comprendre comment la mémoire est allouée, d'identifier les zones problématiques et d'appliquer des solutions appropriées.

Causes des fuites de mémoire en Python

Les fuites de mémoire dans Python peuvent provenir de plusieurs causes, principalement liées à la manière dont les objets sont référencés et gérés. Voici quelques causes courantes de fuites de mémoire en Python −

1. Références inédites

Lorsque les objets ne sont plus nécessaires mais sont toujours référencés quelque part dans le code, ils ne sont pas désalloués, ce qui entraîne des fuites de mémoire. En voici un exemple −

def create_list():
 my_list = [1] * (10**6)
 return my_list
my_list = create_list()
# If my_list is not cleared or reassigned, it continues to consume memory.
print(my_list)

Sortie

[1, 1, 1, 1,
............
............
1, 1, 1, 1]

2. Références circulaires

Les références circulaires en Python peuvent entraîner des fuites de mémoire si elles ne sont pas gérées correctement, mais le garbage collector cyclique de Python peut gérer automatiquement de nombreux cas.

Pour comprendre comment détecter et briser les références circulaires, nous pouvons utiliser des outils tels que les modules gc et lowref. Ces outils sont cruciaux pour une gestion efficace de la mémoire dans les applications Python complexes. Voici l'exemple de références circulaires −

class Node:
 def __init__(self, value):
 self.value = value
 self.next = None
a = Node(1)
b = Node(2)
a.next = b
b.next = a
# 'a' and 'b' reference each other, creating a circular reference.

3. Variables globales

Les variables déclarées au niveau global persistent pendant toute la durée de vie du programme, ce qui peut provoquer des fuites de mémoire si elles ne sont pas gérées correctement. Ci-dessous un exemple −

large_data = [1] * (10**6)
def process_data():
 global large_data
 # Use large_data
 pass
# large_data remains in memory as long as the program runs.

4. Objets de longue durée

Les objets qui persistent pendant toute la durée de vie de l'application peuvent entraîner des problèmes de mémoire s'ils s'accumulent au fil du temps. Voici l'exemple −

cache = {}
def cache_data(key, value):
 cache[key] = value
# Cached data remains in memory until explicitly cleared.

5. Utilisation inappropriée des fermetures

Les fermetures qui capturent et conservent des références à des objets volumineux peuvent provoquer par inadvertance des fuites de mémoire. Ci-dessous un exemple −

def create_closure():
 large_object = [1] * (10**6)
 def closure():
 return large_object
 return closure
my_closure = create_closure()
# The large_object is retained by the closure, causing a memory leak.

Outils de diagnostic des fuites de mémoire

Le diagnostic des fuites de mémoire dans Python peut être difficile, mais plusieurs outils et techniques sont disponibles pour aider à identifier et à résoudre ces problèmes. Voici quelques-uns des outils et méthodes les plus efficaces pour diagnostiquer les fuites de mémoire en Python −

1. Utiliser le module "gc"

Le module gc peut aider à identifier les objets qui ne sont pas collectés par le garbage collector. Voici l'exemple de diagnostic des fuites de mémoire à l'aide du module gc −

import gc
# Enable automatic garbage collection
gc.enable()
# Collect garbage and return unreachable objects
unreachable_objects = gc.collect()
print(f"Unreachable objects: {unreachable_objects}")
# Get a list of all objects tracked by the garbage collector
all_objects = gc.get_objects()
print(f"Number of tracked objects: {len(all_objects)}")

Sortie

Unreachable objects: 51
Number of tracked objects: 6117

2. Utiliser "tracemalloc"

Le module tracemalloc est utilisé pour tracer les allocations de mémoire en Python. Il est utile pour suivre l’utilisation de la mémoire et identifier où la mémoire est allouée. Voici l'exemple de diagnostic des fuites de mémoire à l'aide du module tracemalloc −

import tracemalloc
# Start tracing memory allocations
tracemalloc.start()
# our code here
a = 10
b = 20
c = a+b
# Take a snapshot of current memory usage
snapshot = tracemalloc.take_snapshot()
# Display the top 10 memory-consuming lines
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:10]:
 print(stat)

Sortie

C:\Users\Niharikaa\Desktop\sample.py:7: size=400 B, count=1, average=400 B

3. Utilisation de "memory_profiler"

Le memory_profiler est un module permettant de surveiller l'utilisation de la mémoire d'un programme Python. Il fournit un décorateur pour profiler les fonctions et un outil de ligne de commande pour l'analyse ligne par ligne de l'utilisation de la mémoire. Dans l'exemple ci-dessous, nous diagnostiquons les fuites de mémoire à l'aide du module memory_profiler −

from memory_profiler import profile
@profile
def my_function():
 # our code here
 a = 10
 b = 20
 c = a+b
 
if __name__ == "__main__":
 my_function()

Sortie

Line # Mem usage Increment Occurrences Line 
======================================================================
 3 49.1 MiB 49.1 MiB 1 @profile
 4 def my_function():
 5 # Your code here
 6 49.1 MiB 0.0 MiB 1 a = 10
 7 49.1 MiB 0.0 MiB 1 b = 20
 8 49.1 MiB 0.0 MiB 1 c = a+b

Réparer les fuites de mémoire

Une fois qu'une fuite de mémoire est identifiée, nous pouvons réparer les fuites de mémoire, ce qui implique de localiser et d'éliminer les références inutiles aux objets.

Enfin, nous pouvons conclure que le diagnostic et la correction des fuites de mémoire en Python impliquent d'identifier les références persistantes en utilisant des outils tels que gc, memory_profiler et tracemalloc, etc. pour suivre l'utilisation de la mémoire et implémenter des correctifs tels que la suppression des références inutiles et la rupture des références circulaires.

En suivant ces étapes, nous pouvons garantir que nos programmes Python utilisent efficacement la mémoire et évitent les fuites de mémoire.


Python

  1. Python tandis que la boucle
  2. Gestion des fichiers Python :comment créer un fichier texte, lire, écrire, ouvrir
  3. E/S de fichier Python
  4. Python avec la connectivité MySQL :connecteur, création de base de données, table, insertion [Exemples]
  5. Python - Date et heure
  6. Python RegEx :re.match(), re.search(), re.findall() avec l'exemple
  7. Instructions conditionnelles Python :IF…Else, ELIF et Switch Case
  8. Comment obtenir la date et l'heure actuelles en Python ?
  9. type() et isinstance() en Python avec des exemples