Skip to content

Memory leak when yscale is 'log' and using figsave #17816

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
funkyteilchen opened this issue Jul 1, 2020 · 3 comments
Closed

Memory leak when yscale is 'log' and using figsave #17816

funkyteilchen opened this issue Jul 1, 2020 · 3 comments

Comments

@funkyteilchen
Copy link

Bug report

When plotting and saving a lot of spectrograms in a loop, there seems to be a memory leek. I'm aware that this is some kind of a common problem and I tried already all kind of combinations of plotting the figure new every step, reusing the figure, using plt.close(), plt.close('fig'), gc.collect(), plt.clf(), plt.cla(), but nothing really worked.
Interestingly, I could pinpoint that the leak does not appear or at least gets negligible when the yscale is not 'log'. Can someone give me a work around or has an idea how to set the axis to log without suffering the memory leak?

Code for reproduction

import gc
import psutil
import os
import matplotlib.pyplot as plt
import numpy as np

process = psutil.Process(os.getpid())
# initial memory usage
bytes_used_start = process.memory_info().rss

# generate 10 min data
fs = 20000
x = np.random.rand(fs*600)

for i in range(10):
    
    # create figure
    fig = plt.figure(figsize=(10,6))    
    ax = fig.add_axes([0, 0, 1, 1])   
    
    # plot spectrogram
    spectro, freqs, t, im = ax.specgram(
            x=x,
            NFFT=2**13,
            Fs=fs
            )
    
    ax.axes.set_ylim((9.8,10000))
    #ax.axes.set_yscale('log')      # -> comment this line in for memory leak
    
    fig.savefig('C:/Temp/spectro_{}.jpg'.format(i))
        
    # clean up
    plt.close(fig)
    gc.collect()
    
    # show memory usage
    bytes_used_cur =  process.memory_info().rss - bytes_used_start
    print('bytes used currently at step {} : {}'.format(i, bytes_used_cur))

Outcome yscale linear

bytes used currently at step 0 : 256192512
bytes used currently at step 1 : 257204224
bytes used currently at step 2 : 257437696
bytes used currently at step 3 : 257343488
bytes used currently at step 4 : 257519616
bytes used currently at step 5 : 257581056
bytes used currently at step 6 : 257515520
bytes used currently at step 7 : 257581056
bytes used currently at step 8 : 257449984
bytes used currently at step 9 : 257585152

Outcome yscale log

bytes used currently at step 0 : 42557440
bytes used currently at step 1 : 83501056
bytes used currently at step 2 : 122126336
bytes used currently at step 3 : 161177600
bytes used currently at step 4 : 199602176
bytes used currently at step 5 : 238022656
bytes used currently at step 6 : 276516864
bytes used currently at step 7 : 314994688
bytes used currently at step 8 : 353480704
bytes used currently at step 9 : 391954432

Matplotlib version

  • Operating system: Windows 7
  • Matplotlib version: '3.1.3'
  • Matplotlib backend: Qt5Agg
  • Python version: 3.7.4
@tacaswell
Copy link
Member

Can you try 3.2.2? I think this is a duplicate of #15474

@funkyteilchen
Copy link
Author

Ah sorry, don't know why I did not stumble upon that bug report. Yes, upgrading fixed this problem. Thanks!

@tacaswell
Copy link
Member

@funkyteilchen No worries, bug reports that we have already fixed are the best bug reports (every one ends up happier almost immediately!).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants