Skip to content

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

Closed
@funkyteilchen

Description

@funkyteilchen

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions