5 votes

Fuite de mémoire dans Jupyter-Notebook avec Anaconda 5.1.0 ou plus récent lors de l'utilisation de matplotlib

J'utilisais Jupyter-notebook avec la dernière version d'Anaconda (2018.12) et j'ai remarqué qu'il utilisait une énorme quantité de mémoire (environ 6 Go) pour faire des graphiques et enregistrer directement ~2000 figures (1920x1080) en fichiers .png sous Ubuntu 18.04.

J'ai essayé de reproduire ce problème sur mon Mac avec Anaconda 4.4.0, mais le problème ne s'est pas produit.

Plus tard, j'ai essayé d'installer plusieurs versions différentes d'Anaconda sur ma machine Ubuntu et j'ai réussi à reproduire le problème de fuite de mémoire avec un code plus simple.

Il s'est avéré qu'Anaconda 5.0.0 est la dernière version qui n'a pas ce problème spécifique de fuite de mémoire.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1,101)
n = 0
dt = 0.01
w = 1

while n <= 1000:
    y = np.sin(2*np.pi*x + w*n*dt)
    plt.clf()
    plt.title("T = %.02f s." %(n*dt))
    plt.plot(x,y)
    plt.savefig("dat/dat_%05d.png" % (n))
    plt.close()
    n = n+1

J'utilise htop pour surveiller l'utilisation de la mémoire.

Avec Anaconda 5.0.0, cela montre une utilisation constante de 1,3% de la mémoire sur ma machine avec 8 Go de RAM.

Avec Anaconda 5.1.0, l'utilisation de la mémoire commence à environ 2% et augmente rapidement au fur et à mesure qu'il enregistre les graphiques en fichiers .png, atteignant 16% d'utilisation de la mémoire, et reste le même même après la fin de l'exécution de la cellule.

J'ai essayé d'utiliser

import gc
gc.collect()

et l'utilisation de la mémoire diminue un peu jusqu'à 12%.

Et bien sûr, par utilisation de la mémoire, je veux dire une utilisation de la mémoire uniquement par ces processus python particuliers, pas l'utilisation de mémoire de tout le système.

Est-ce que quelqu'un a déjà réussi à résoudre ce problème de fuite de mémoire dans jupyter-notebook inclus dans la dernière version d'Anaconda ?

0voto

chaig Points 61

Réinitialiser la variable y à chaque cycle de la boucle while est une mauvaise pratique, car l'objet original est toujours en mémoire quelque part, il n'a tout simplement plus de référence. Vous pouvez utiliser del y à la fin de chaque boucle while, avant l'instruction n = n+1, mais cela ne le libère PAS non plus de la mémoire... il reste simplement là jusqu'à ce que le ramasse-miettes de Python s'en occupe. Ajouter cette ligne pourrait éventuellement libérer la mémoire un peu plus rapidement.

Je suppose que vous avez vu ceci : https://www.quora.com/Why-doesnt-Python-release-the-memory-when-I-delete-a-large-object

Il pourrait être plus rapide pour vous de créer le graphique par petits morceaux, en raison du problème de ramasse-miettes.

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