web-dev-qa-db-fra.com

Comment libérer de la mémoire après avoir créé des figures matplotlib

J'ai plusieurs fonctions matlpotlib intégrées dans certaines tâches Django-céleri.

Chaque fois que les tâches sont appelées plus RAM est dédiée au python. Avant trop longtemps, python occupe toute la RAM).

QUESTION: Comment puis-je libérer cette mémoire?

MISE À JOUR 2 - Une deuxième solution:

J'ai posé une question similaire spécifiquement sur la mémoire verrouillée lors d'erreurs matplotlib, mais j'ai obtenu une bonne réponse à cette question .clf(), .close() et gc.collect() aren ' t nécessaire si vous utilisez le multiprocessus pour exécuter la fonction de traçage dans un processus distinct dont la mémoire sera automatiquement libérée une fois le processus terminé.

Les erreurs Matplotlib entraînent une fuite de mémoire. Comment puis-je libérer cette mémoire?

MISE À JOUR - La solution:

Ces messages de stackoverflow ont suggéré que je puisse libérer la mémoire utilisée par les objets matplotlib avec les commandes suivantes:

.clf(): Matplotlib manque de mémoire lors du traçage dans une boucle

.close(): Python matplotlib: la mémoire n'est pas libérée lors de la spécification de la taille de la figure

import gc
gc.collect()

Voici l'exemple que j'ai utilisé pour tester la solution:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import import figure, savefig
import numpy as np
import gc      

a = np.arange(1000000)
b = np.random.randn(1000000)

fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w')
fig.set_size_inches(10,7)
ax = fig.add_subplot(111)
ax.plot(a, b)

fig.clf()
plt.close()
del a, b
gc.collect()
57
sequoia

Avez-vous essayé d'exécuter votre fonction de tâche plusieurs fois (dans un pour) pour être sûr que votre fonction ne fuit pas, peu importe le céleri? Assurez-vous que Django.settings.DEBUG est défini sur False (l'objet de connexion contient toutes les requêtes en mémoire lorsque DEBUG = True).

4
Nicolae Dascalu