Closed
Description
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
Labels
No labels