2017-06-01 2 views
0

Donc, je suis en train de tracer beaucoup de tracés, environ 5000, et ma RAM est pleine. J'ai cherché le site et le Web et trouvé plusieurs solutions, telles que plt.close, plt.clf() et gc.collect(), mais aucune aide. Je ne comprends pas pourquoi ma mémoire est pleine même si je ferme toutes les figures. L'aide serait très appréciée.RAM complète lors de la création de tracés dans les boucles

sujet Même ici, mais la solution de travail w/oa pour moi: How can I release memory after creating matplotlib figures

y = range(5039*402) 
x = np.arange(0,402,1) 
for i in xrange(len(data_collection)-1): 
    plt.figure() 
    plt.plot(x,y[i*402:402*(i+1)]) 
    plt.savefig('save%i.png'%(i)) 
    plt.close() 

Désolé, peut-être une question facile, mais je suis nouveau python

Répondre

0

Vous ne mentionnez pas quelle version de matplotlib que vous utilisez, mais c'est un problème connu avec les versions antérieures (il est supposé être corrigé dans 2.0.x). Une méthode que j'ai utilisée pour "contourner" la fuite de mémoire est de créer chaque intrigue dans son propre processus. Par exemple, vous pouvez utiliser un sous-processus, un thread ou un multiprocessus pour chaque tracé.

Python subprocess

Python threading

Python multiprocessing

Mon approche préférée est multitraitement parce que (OMI), il est beaucoup plus facile de faire bouger les choses dans et hors de chaque processus (les objets doivent être pickleable.)

Python pickling

ETA: Voici un exemple stupide pour montrer comment vous pourriez structurer votre script en utilisant le multitraitement.

import datetime as dt 
import multiprocessing as mp 

return_queue1 = mp.Queue() 
return_queue2 = mp.Queue() 

def foo(text, return_queue): 
    for _ in range(5000): 
     continue 
    return_queue.put(dt.datetime.now()) 

def bar(text, return_queue): 
    for _ in range(5000): 
     continue 
    return_queue.put(dt.datetime.now()) 

for _ in range(5): 
    log = 0 
    if __name__ == '__main__': 
     for _ in range(100): 
      p1 = mp.Process(name='p1', target=foo, args=('foo', return_queue1,)) 
      p2 = mp.Process(name='p2', target=bar, args=('bar', return_queue2,)) 
      p1.start() 
      p2.start() 

      if return_queue1.get() > return_queue2.get(): 
       log += 1 

     p1.join() 
     p2.join() 
     print(u"Times bar won: {0}".format(log)) 
+0

Ahh, je vois. J'utilise la version 1.5.3. Pour tout le monde avec le même problème, vous pouvez vérifier votre version juste par: importer matplotlib comme mpl impression mpl .__ version__ – Nils

+0

Je viens de mettre à jour matplotlib à la version 2.0.2 mais j'ai toujours le même problème:/semble que je vais avoir à utiliser une solution de contournement – Nils

+0

Désolé d'entendre que cela n'a pas fonctionné. J'ai ajouté un exemple stupide ci-dessus pour montrer une façon d'incorporer le multitraitement dans un script. – DaveL17